Finish breaking up VectBuiltIn and VectMonad, and add comments
[ghc-hetmet.git] / compiler / vectorise / VectBuiltIn.hs
diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs
deleted file mode 100644 (file)
index 360d17b..0000000
+++ /dev/null
@@ -1,584 +0,0 @@
-
--- | The vectoriser rewrites user code to use builtin types and functions exported by the DPH library.
---   We track the names of those things in the `Builtis` type, and provide selection functions 
---   to help extract their names.
-module VectBuiltIn (
-  Builtins(..),
-
-  -- * Projections
-  sumTyCon, prodTyCon, prodDataCon,
-  selTy,selReplicate, selPick, selTags, selElements,
-  combinePDVar, scalarZip, closureCtrFun,
-
-  -- * Initialisation
-  initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons,
-  initBuiltinPAs, initBuiltinPRs,
-  initBuiltinBoxedTyCons, initBuiltinScalars,
-
-  primMethod, primPArray
-) where
-
-import Vectorise.Builtins.Modules
-import Vectorise.Builtins.Base
-
-import DsMonad
-import IfaceEnv        ( lookupOrig )
-import InstEnv
-
-import Module
-import DataCon         ( DataCon, dataConName, dataConWorkId )
-import TyCon           ( TyCon, tyConName, tyConDataCons )
-import Class           ( Class, classTyCon )
-import CoreSyn         ( CoreExpr, Expr(..) )
-import Var             ( Var )
-import Id              ( mkSysLocal )
-import Name            ( Name, getOccString )
-import NameEnv
-import OccName
-
-import TypeRep         ( funTyCon )
-import Type            ( Type, mkTyConApp )
-import TysPrim
-import TysWiredIn      ( unitDataCon,
-                         tupleCon,
-                         intTyCon,
-                         doubleTyCon,
-                         boolTyCon, trueDataCon, falseDataCon,
-                         parrTyConName )
-import PrelNames       ( word8TyConName, gHC_PARR, gHC_CLASSES )
-import BasicTypes      ( Boxity(..) )
-
-import FastString
-import Outputable
-
-import Data.Array
-import Control.Monad   ( liftM, zipWithM )
-import Data.List       ( unzip4 )
-
-
-
-
--- Initialisation -------------------------------------------------------------
--- | Create the initial map of builtin types and functions.
-initBuiltins 
-       :: PackageId    -- ^ package id the builtins are in, eg dph-common
-       -> DsM Builtins
-
-initBuiltins pkg
-  = do
-      mapM_ load dph_Orphans
-
-      -- From dph-common:Data.Array.Parallel.Lifted.PArray
-      parrayTyCon      <- externalTyCon dph_PArray (fsLit "PArray")
-      let [parrayDataCon] = tyConDataCons parrayTyCon
-      pdataTyCon       <- externalTyCon dph_PArray (fsLit "PData")
-      paTyCon          <- externalClassTyCon dph_PArray (fsLit "PA")
-      let [paDataCon]  = tyConDataCons paTyCon
-      preprTyCon       <- externalTyCon dph_PArray (fsLit "PRepr")
-      prTyCon          <- externalClassTyCon dph_PArray (fsLit "PR")
-      let [prDataCon]  = tyConDataCons prTyCon
-
-      -- wher
-      closureTyCon     <- externalTyCon dph_Closure (fsLit ":->")
-
-      -- From dph-common:Data.Array.Parallel.Lifted.Repr
-      voidTyCon                <- externalTyCon dph_Repr (fsLit "Void")
-      wrapTyCon                <- externalTyCon dph_Repr (fsLit "Wrap")
-
-      -- From dph-common:Data.Array.Parallel.Lifted.Unboxed
-      sel_tys      <- mapM (externalType dph_Unboxed)
-                           (numbered "Sel" 2 mAX_DPH_SUM)
-
-      sel_replicates <- mapM (externalFun dph_Unboxed)
-                             (numbered_hash "replicateSel" 2 mAX_DPH_SUM)
-
-      sel_picks    <- mapM (externalFun dph_Unboxed)
-                           (numbered_hash "pickSel" 2 mAX_DPH_SUM)
-
-      sel_tags     <- mapM (externalFun dph_Unboxed)
-                           (numbered "tagsSel" 2 mAX_DPH_SUM)
-
-      sel_els      <- mapM mk_elements
-                           [(i,j) | i <- [2..mAX_DPH_SUM], j <- [0..i-1]]
-
-      sum_tcs      <- mapM (externalTyCon dph_Repr)
-                           (numbered "Sum" 2 mAX_DPH_SUM)
-
-      let selTys        = listArray (2, mAX_DPH_SUM) sel_tys
-          selReplicates = listArray (2, mAX_DPH_SUM) sel_replicates
-          selPicks      = listArray (2, mAX_DPH_SUM) sel_picks
-          selTagss      = listArray (2, mAX_DPH_SUM) sel_tags
-          selEls        = array ((2,0), (mAX_DPH_SUM, mAX_DPH_SUM)) sel_els
-          sumTyCons     = listArray (2, mAX_DPH_SUM) sum_tcs
-
-
-      voidVar          <- externalVar dph_Repr (fsLit "void")
-      pvoidVar         <- externalVar dph_Repr (fsLit "pvoid")
-      fromVoidVar      <- externalVar dph_Repr (fsLit "fromVoid")
-      punitVar         <- externalVar dph_Repr (fsLit "punit")
-      closureVar       <- externalVar dph_Closure (fsLit "closure")
-      applyVar         <- externalVar dph_Closure (fsLit "$:")
-      liftedClosureVar <- externalVar dph_Closure (fsLit "liftedClosure")
-      liftedApplyVar   <- externalVar dph_Closure (fsLit "liftedApply")
-      replicatePDVar   <- externalVar dph_PArray (fsLit "replicatePD")
-      emptyPDVar       <- externalVar dph_PArray (fsLit "emptyPD")
-      packByTagPDVar   <- externalVar dph_PArray (fsLit "packByTagPD")
-
-      combines                 <- mapM (externalVar dph_PArray)
-                                       [mkFastString ("combine" ++ show i ++ "PD")
-                                       | i <- [2..mAX_DPH_COMBINE]]
-      let combinePDVars = listArray (2, mAX_DPH_COMBINE) combines
-
-      scalarClass      <- externalClass dph_PArray (fsLit "Scalar")
-      scalar_map       <- externalVar dph_Scalar (fsLit "scalar_map")
-      scalar_zip2      <- externalVar dph_Scalar (fsLit "scalar_zipWith")
-      scalar_zips      <- mapM (externalVar dph_Scalar)
-                               (numbered "scalar_zipWith" 3 mAX_DPH_SCALAR_ARGS)
-      let scalarZips   = listArray (1, mAX_DPH_SCALAR_ARGS)
-                                 (scalar_map : scalar_zip2 : scalar_zips)
-      closures                 <- mapM (externalVar dph_Closure)
-                                       (numbered "closure" 1 mAX_DPH_SCALAR_ARGS)
-      let closureCtrFuns = listArray (1, mAX_DPH_COMBINE) closures
-
-      liftingContext <- liftM (\u -> mkSysLocal (fsLit "lc") u intPrimTy)
-                              newUnique
-
-      return $ Builtins {
-                 dphModules       = modules
-               , parrayTyCon      = parrayTyCon
-               , parrayDataCon    = parrayDataCon
-               , pdataTyCon       = pdataTyCon
-               , paTyCon          = paTyCon
-               , paDataCon        = paDataCon
-               , preprTyCon       = preprTyCon
-               , prTyCon          = prTyCon
-               , prDataCon        = prDataCon
-               , voidTyCon        = voidTyCon
-               , wrapTyCon        = wrapTyCon
-               , selTys           = selTys
-               , selReplicates    = selReplicates
-               , selPicks         = selPicks
-               , selTagss         = selTagss
-               , selEls           = selEls
-               , sumTyCons        = sumTyCons
-               , closureTyCon     = closureTyCon
-               , voidVar          = voidVar
-               , pvoidVar         = pvoidVar
-               , fromVoidVar      = fromVoidVar
-               , punitVar         = punitVar
-               , closureVar       = closureVar
-               , applyVar         = applyVar
-               , liftedClosureVar = liftedClosureVar
-               , liftedApplyVar   = liftedApplyVar
-               , replicatePDVar   = replicatePDVar
-               , emptyPDVar       = emptyPDVar
-               , packByTagPDVar   = packByTagPDVar
-               , combinePDVars    = combinePDVars
-               , scalarClass      = scalarClass
-               , scalarZips       = scalarZips
-               , closureCtrFuns   = closureCtrFuns
-               , liftingContext   = liftingContext
-               }
-  where
-    modules@(Modules {
-               dph_PArray         = dph_PArray
-             , dph_Repr           = dph_Repr
-             , dph_Closure        = dph_Closure
-             , dph_Scalar         = dph_Scalar
-             , dph_Unboxed        = dph_Unboxed
-             })
-      = dph_Modules pkg
-
-    load get_mod = dsLoadModule doc mod
-      where
-        mod = get_mod modules 
-        doc = ppr mod <+> ptext (sLit "is a DPH module")
-
-    -- Make a list of numbered strings in some range, eg foo3, foo4, foo5
-    numbered :: String -> Int -> Int -> [FastString]
-    numbered pfx m n = [mkFastString (pfx ++ show i) | i <- [m..n]]
-
-    numbered_hash :: String -> Int -> Int -> [FastString]
-    numbered_hash pfx m n = [mkFastString (pfx ++ show i ++ "#") | i <- [m..n]]
-
-    mk_elements :: (Int, Int) -> DsM ((Int, Int), CoreExpr)
-    mk_elements (i,j)
-      = do
-          v <- externalVar dph_Unboxed
-             $ mkFastString ("elementsSel" ++ show i ++ "_" ++ show j ++ "#")
-          return ((i,j), Var v)
-
-
--- | Get the mapping of names in the Prelude to names in the DPH library.
-initBuiltinVars :: Builtins -> DsM [(Var, Var)]
-initBuiltinVars (Builtins { dphModules = mods })
-  = do
-      uvars <- zipWithM externalVar umods ufs
-      vvars <- zipWithM externalVar vmods vfs
-      cvars <- zipWithM externalVar cmods cfs
-      return $ [(v,v) | v <- map dataConWorkId defaultDataConWorkers]
-               ++ zip (map dataConWorkId cons) cvars
-               ++ zip uvars vvars
-  where
-    (umods, ufs, vmods, vfs) = unzip4 (preludeVars mods)
-    (cons, cmods, cfs)       = unzip3 (preludeDataCons mods)
-
-defaultDataConWorkers :: [DataCon]
-defaultDataConWorkers = [trueDataCon, falseDataCon, unitDataCon]
-
-preludeDataCons :: Modules -> [(DataCon, Module, FastString)]
-preludeDataCons (Modules { dph_Prelude_Tuple = dph_Prelude_Tuple })
-  = [mk_tup n dph_Prelude_Tuple (mkFastString $ "tup" ++ show n) | n <- [2..3]]
-  where
-    mk_tup n mod name = (tupleCon Boxed n, mod, name)
-
-
--- | Mapping of prelude functions to vectorised versions.
---     Functions like filterP currently have a working but naive version in GHC.PArr
---     During vectorisation we replace these by calls to filterPA, which are
---     defined in dph-common Data.Array.Parallel.Lifted.Combinators
---
---     As renamer only sees the GHC.PArr functions, if you want to add a new function
---     to the vectoriser there has to be a definition for it in GHC.PArr, even though
---     it will never be used at runtime.
---
-preludeVars :: Modules -> [(Module, FastString, Module, FastString)]
-preludeVars (Modules { dph_Combinators    = dph_Combinators
-                     , dph_PArray         = dph_PArray
-                     , dph_Prelude_Int    = dph_Prelude_Int
-                     , dph_Prelude_Word8  = dph_Prelude_Word8
-                     , dph_Prelude_Double = dph_Prelude_Double
-                     , dph_Prelude_Bool   = dph_Prelude_Bool 
-                     , dph_Prelude_PArr   = dph_Prelude_PArr
-                     })
-
-    -- Functions that work on whole PArrays, defined in GHC.PArr
-  = [ mk gHC_PARR (fsLit "mapP")       dph_Combinators (fsLit "mapPA")
-    , mk gHC_PARR (fsLit "zipWithP")   dph_Combinators (fsLit "zipWithPA")
-    , mk gHC_PARR (fsLit "zipP")       dph_Combinators (fsLit "zipPA")
-    , mk gHC_PARR (fsLit "unzipP")     dph_Combinators (fsLit "unzipPA")
-    , mk gHC_PARR (fsLit "filterP")    dph_Combinators (fsLit "filterPA")
-    , mk gHC_PARR (fsLit "lengthP")    dph_Combinators (fsLit "lengthPA")
-    , mk gHC_PARR (fsLit "replicateP") dph_Combinators (fsLit "replicatePA")
-    , mk gHC_PARR (fsLit "!:")         dph_Combinators (fsLit "indexPA")
-    , mk gHC_PARR (fsLit "sliceP")     dph_Combinators (fsLit "slicePA")
-    , mk gHC_PARR (fsLit "crossMapP")  dph_Combinators (fsLit "crossMapPA")
-    , mk gHC_PARR (fsLit "singletonP") dph_Combinators (fsLit "singletonPA")
-    , mk gHC_PARR (fsLit "concatP")    dph_Combinators (fsLit "concatPA")
-    , mk gHC_PARR (fsLit "+:+")        dph_Combinators (fsLit "appPA")
-    , mk gHC_PARR (fsLit "emptyP")     dph_PArray      (fsLit "emptyPA")
-
-    -- Map scalar functions to versions using closures. 
-    , mk' dph_Prelude_Int "div"         "divV"
-    , mk' dph_Prelude_Int "mod"         "modV"
-    , mk' dph_Prelude_Int "sqrt"        "sqrtV"
-    , mk' dph_Prelude_Int "enumFromToP" "enumFromToPA"
-    -- , mk' dph_Prelude_Int "upToP" "upToPA"
-    ]
-    ++ vars_Ord dph_Prelude_Int
-    ++ vars_Num dph_Prelude_Int
-
-    ++ vars_Ord dph_Prelude_Word8
-    ++ vars_Num dph_Prelude_Word8
-    ++
-    [ mk' dph_Prelude_Word8 "div"     "divV"
-    , mk' dph_Prelude_Word8 "mod"     "modV"
-    , mk' dph_Prelude_Word8 "fromInt" "fromIntV"
-    , mk' dph_Prelude_Word8 "toInt"   "toIntV"
-    ]
-
-    ++ vars_Ord        dph_Prelude_Double
-    ++ vars_Num        dph_Prelude_Double
-    ++ vars_Fractional dph_Prelude_Double
-    ++ vars_Floating   dph_Prelude_Double
-    ++ vars_RealFrac   dph_Prelude_Double
-    ++
-    [ mk dph_Prelude_Bool  (fsLit "andP")  dph_Prelude_Bool (fsLit "andPA")
-    , mk dph_Prelude_Bool  (fsLit "orP")   dph_Prelude_Bool (fsLit "orPA")
-
-    , mk gHC_CLASSES (fsLit "not")         dph_Prelude_Bool (fsLit "notV")
-    , mk gHC_CLASSES (fsLit "&&")          dph_Prelude_Bool (fsLit "andV")
-    , mk gHC_CLASSES (fsLit "||")          dph_Prelude_Bool (fsLit "orV")
-
-    -- FIXME: temporary
-    , mk dph_Prelude_PArr (fsLit "fromPArrayP")       dph_Prelude_PArr (fsLit "fromPArrayPA")
-    , mk dph_Prelude_PArr (fsLit "toPArrayP")         dph_Prelude_PArr (fsLit "toPArrayPA")
-    , mk dph_Prelude_PArr (fsLit "fromNestedPArrayP") dph_Prelude_PArr (fsLit "fromNestedPArrayPA")
-    , mk dph_Prelude_PArr (fsLit "combineP")          dph_Combinators  (fsLit "combine2PA")
-    , mk dph_Prelude_PArr (fsLit "updateP")           dph_Combinators  (fsLit "updatePA")
-    , mk dph_Prelude_PArr (fsLit "bpermuteP")         dph_Combinators  (fsLit "bpermutePA")
-    , mk dph_Prelude_PArr (fsLit "indexedP")          dph_Combinators  (fsLit "indexedPA")
-    ]
-  where
-    mk  = (,,,)
-    mk' mod v v' = mk mod (fsLit v) mod (fsLit v')
-
-    vars_Ord mod 
-     = [ mk' mod "=="        "eqV"
-       , mk' mod "/="        "neqV"
-       , mk' mod "<="        "leV"
-       , mk' mod "<"         "ltV"
-       , mk' mod ">="        "geV"
-       , mk' mod ">"         "gtV"
-       , mk' mod "min"       "minV"
-       , mk' mod "max"       "maxV"
-       , mk' mod "minimumP"  "minimumPA"
-       , mk' mod "maximumP"  "maximumPA"
-       , mk' mod "minIndexP" "minIndexPA"
-       , mk' mod "maxIndexP" "maxIndexPA"
-       ]
-
-    vars_Num mod 
-     = [ mk' mod "+"        "plusV"
-       , mk' mod "-"        "minusV"
-       , mk' mod "*"        "multV"
-       , mk' mod "negate"   "negateV"
-       , mk' mod "abs"      "absV"
-       , mk' mod "sumP"     "sumPA"
-       , mk' mod "productP" "productPA"
-       ]
-
-    vars_Fractional mod 
-     = [ mk' mod "/"     "divideV"
-       , mk' mod "recip" "recipV"
-       ]
-
-    vars_Floating mod 
-     = [ mk' mod "pi"      "pi"
-       , mk' mod "exp"     "expV"
-       , mk' mod "sqrt"    "sqrtV"
-       , mk' mod "log"     "logV"
-       , mk' mod "sin"     "sinV"
-       , mk' mod "tan"     "tanV"
-       , mk' mod "cos"     "cosV"
-       , mk' mod "asin"    "asinV"
-       , mk' mod "atan"    "atanV"
-       , mk' mod "acos"    "acosV"
-       , mk' mod "sinh"    "sinhV"
-       , mk' mod "tanh"    "tanhV"
-       , mk' mod "cosh"    "coshV"
-       , mk' mod "asinh"   "asinhV"
-       , mk' mod "atanh"   "atanhV"
-       , mk' mod "acosh"   "acoshV"
-       , mk' mod "**"      "powV"
-       , mk' mod "logBase" "logBaseV"
-       ]
-
-    vars_RealFrac mod
-     = [ mk' mod "fromInt"  "fromIntV"
-       , mk' mod "truncate" "truncateV"
-       , mk' mod "round"    "roundV"
-       , mk' mod "ceiling"  "ceilingV"
-       , mk' mod "floor"    "floorV"
-       ]
-
-
--- | Get a list of names to `TyCon`s in the mock prelude.
-initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)]
-initBuiltinTyCons bi
-  = do
-      -- parr <- externalTyCon dph_Prelude_PArr (fsLit "PArr")
-      dft_tcs <- defaultTyCons
-      return $ (tyConName funTyCon, closureTyCon bi)
-             : (parrTyConName,      parrayTyCon bi)
-
-             -- FIXME: temporary
-             : (tyConName $ parrayTyCon bi, parrayTyCon bi)
-
-             : [(tyConName tc, tc) | tc <- dft_tcs]
-
-defaultTyCons :: DsM [TyCon]
-defaultTyCons
-  = do
-      word8 <- dsLookupTyCon word8TyConName
-      return [intTyCon, boolTyCon, doubleTyCon, word8]
-
-
--- | Get a list of names to `DataCon`s in the mock prelude.
-initBuiltinDataCons :: Builtins -> [(Name, DataCon)]
-initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons]
-
-defaultDataCons :: [DataCon]
-defaultDataCons = [trueDataCon, falseDataCon, unitDataCon]
-
-
--- | Get the names of all buildin instance functions for the PA class.
-initBuiltinPAs :: Builtins -> (InstEnv, InstEnv) -> DsM [(Name, Var)]
-initBuiltinPAs (Builtins { dphModules = mods }) insts
-  = liftM (initBuiltinDicts insts) (externalClass (dph_PArray mods) (fsLit "PA"))
-
-
--- | Get the names of all builtin instance functions for the PR class.
-initBuiltinPRs :: Builtins -> (InstEnv, InstEnv) -> DsM [(Name, Var)]
-initBuiltinPRs (Builtins { dphModules = mods }) insts
-  = liftM (initBuiltinDicts insts) (externalClass (dph_PArray mods) (fsLit "PR"))
-
-
--- | Get the names of all DPH instance functions for this class.
-initBuiltinDicts :: (InstEnv, InstEnv) -> Class -> [(Name, Var)]
-initBuiltinDicts insts cls = map find $ classInstances insts cls
-  where
-    find i | [Just tc] <- instanceRoughTcs i   = (tc, instanceDFunId i)
-           | otherwise                         = pprPanic "Invalid DPH instance" (ppr i)
-
-
--- | Get a list of boxed `TyCons` in the mock prelude. This is Int only.
-initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)]
-initBuiltinBoxedTyCons = return . builtinBoxedTyCons
-
-builtinBoxedTyCons :: Builtins -> [(Name, TyCon)]
-builtinBoxedTyCons _ 
-  = [(tyConName intPrimTyCon, intTyCon)]
-
-
--- | Get a list of all scalar functions in the mock prelude.
-initBuiltinScalars :: Builtins -> DsM [Var]
-initBuiltinScalars bi
-  = mapM (uncurry externalVar) (preludeScalars $ dphModules bi)
-
-
-preludeScalars :: Modules -> [(Module, FastString)]
-preludeScalars (Modules { dph_Prelude_Int    = dph_Prelude_Int
-                        , dph_Prelude_Word8  = dph_Prelude_Word8
-                        , dph_Prelude_Double = dph_Prelude_Double
-                        })
-  = [ mk dph_Prelude_Int "div"
-    , mk dph_Prelude_Int "mod"
-    , mk dph_Prelude_Int "sqrt"
-    ]
-    ++ scalars_Ord dph_Prelude_Int
-    ++ scalars_Num dph_Prelude_Int
-
-    ++ scalars_Ord dph_Prelude_Word8
-    ++ scalars_Num dph_Prelude_Word8
-    ++
-    [ mk dph_Prelude_Word8 "div"
-    , mk dph_Prelude_Word8 "mod"
-    , mk dph_Prelude_Word8 "fromInt"
-    , mk dph_Prelude_Word8 "toInt"
-    ]
-
-    ++ scalars_Ord dph_Prelude_Double
-    ++ scalars_Num dph_Prelude_Double
-    ++ scalars_Fractional dph_Prelude_Double
-    ++ scalars_Floating dph_Prelude_Double
-    ++ scalars_RealFrac dph_Prelude_Double
-  where
-    mk mod s = (mod, fsLit s)
-
-    scalars_Ord mod 
-     = [ mk mod "=="
-       , mk mod "/="
-       , mk mod "<="
-       , mk mod "<"
-       , mk mod ">="
-       , mk mod ">"
-       , mk mod "min"
-       , mk mod "max"
-       ]
-
-    scalars_Num mod 
-     = [ mk mod "+"
-       , mk mod "-"
-       , mk mod "*"
-       , mk mod "negate"
-       , mk mod "abs"
-       ]
-
-    scalars_Fractional mod 
-     = [ mk mod "/"
-       , mk mod "recip"
-       ]
-
-    scalars_Floating mod 
-     = [ mk mod "pi"
-       , mk mod "exp"
-       , mk mod "sqrt"
-       , mk mod "log"
-       , mk mod "sin"
-       , mk mod "tan"
-       , mk mod "cos"
-       , mk mod "asin"
-       , mk mod "atan"
-       , mk mod "acos"
-       , mk mod "sinh"
-       , mk mod "tanh"
-       , mk mod "cosh"
-       , mk mod "asinh"
-       , mk mod "atanh"
-       , mk mod "acosh"
-       , mk mod "**"
-       , mk mod "logBase"
-       ]
-
-    scalars_RealFrac mod 
-     = [ mk mod "fromInt"
-       , mk mod "truncate"
-       , mk mod "round"
-       , mk mod "ceiling"
-       , mk mod "floor"
-       ]
-
-
--- | Lookup some variable given its name and the module that contains it.
-externalVar :: Module -> FastString -> DsM Var
-externalVar mod fs
-  = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs)
-
-
--- | Like `externalVar` but wrap the `Var` in a `CoreExpr`
-externalFun :: Module -> FastString -> DsM CoreExpr
-externalFun mod fs
- = do var <- externalVar mod fs
-      return $ Var var
-
-
--- | Lookup some `TyCon` given its name and the module that contains it.
-externalTyCon :: Module -> FastString -> DsM TyCon
-externalTyCon mod fs
-  = dsLookupTyCon =<< lookupOrig mod (mkTcOccFS fs)
-
-
--- | Lookup some `Type` given its name and the module that contains it.
-externalType :: Module -> FastString -> DsM Type
-externalType mod fs
- = do  tycon <- externalTyCon mod fs
-       return $ mkTyConApp tycon []
-
-
--- | Lookup some `Class` given its name and the module that contains it.
-externalClass :: Module -> FastString -> DsM Class
-externalClass mod fs
-  = dsLookupClass =<< lookupOrig mod (mkClsOccFS fs)
-
-
--- | Like `externalClass`, but get the TyCon of of the class.
-externalClassTyCon :: Module -> FastString -> DsM TyCon
-externalClassTyCon mod fs = liftM classTyCon (externalClass mod fs)
-
-
--- | Lookup a method function given its name and instance type.
-primMethod :: TyCon -> String -> Builtins -> DsM (Maybe Var)
-primMethod  tycon method (Builtins { dphModules = mods })
-  | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
-  = liftM Just
-  $ dsLookupGlobalId =<< lookupOrig (dph_Unboxed mods)
-                                    (mkVarOcc $ method ++ suffix)
-
-  | otherwise = return Nothing
-
--- | Lookup the representation type we use for PArrays that contain a given element type.
-primPArray :: TyCon -> Builtins -> DsM (Maybe TyCon)
-primPArray tycon (Builtins { dphModules = mods })
-  | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
-  = liftM Just
-  $ dsLookupTyCon =<< lookupOrig (dph_Unboxed mods)
-                                 (mkTcOcc $ "PArray" ++ suffix)
-
-  | otherwise = return Nothing
-
-prim_ty_cons :: NameEnv String
-prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
-  where
-    mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)
-