Improve the runRW magic in CorePrep
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 24 Dec 2015 14:42:34 +0000 (14:42 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 24 Dec 2015 14:59:57 +0000 (14:59 +0000)
Instead of substituting, just augment the environment.
Less code, more efficient.

And the previous version had a bogus in-scope set which
triggered a WARNING

compiler/coreSyn/CorePrep.hs

index 70eb1a1..8b4b13b 100644 (file)
@@ -516,15 +516,11 @@ cpeRhsE env (Var f `App` _{-type-} `App` arg)
   | f `hasKey` lazyIdKey          -- Replace (lazy a) by a
   = cpeRhsE env arg               -- See Note [lazyId magic] in MkId
 
-cpeRhsE env (Var f `App` _{-levity-} `App` _{-type-} `App` arg)
+cpeRhsE env (Var f `App` _levity `App` _type `App` arg)
     -- See Note [runRW magic] in MkId
   | f `hasKey` runRWKey           -- Replace (runRW# f) by (f realWorld#),
   = case arg of                   -- beta reducing if possible
-      Lam s body -> cpeRhsE env (substExpr (text "runRW#") subst body)
-        where subst = extendIdSubst emptySubst s (Var realWorldPrimId)
-                      -- XXX I think we can use emptySubst here
-                      -- because realWorldPrimId is a global variable
-                      -- and so cannot be bound by a lambda in body
+      Lam s body -> cpeRhsE (extendCorePrepEnv env s realWorldPrimId) body
       _          -> cpeRhsE env (arg `App` Var realWorldPrimId)
 
 cpeRhsE env expr@(App {}) = cpeApp env expr
@@ -1161,12 +1157,12 @@ allLazyNested is_rec (Floats IfUnboxedOk _) = isNonRec is_rec
 --                      The environment
 -- ---------------------------------------------------------------------------
 
-data CorePrepEnv = CPE {
-                       cpe_dynFlags    :: DynFlags,
-                       cpe_env         :: (IdEnv Id), -- Clone local Ids
-                       cpe_mkIntegerId :: Id,
-                       cpe_integerSDataCon :: Maybe DataCon
-                   }
+data CorePrepEnv
+  = CPE { cpe_dynFlags        :: DynFlags
+        , cpe_env             :: IdEnv Id   -- Clone local Ids
+        , cpe_mkIntegerId     :: Id
+        , cpe_integerSDataCon :: Maybe DataCon
+    }
 
 lookupMkIntegerName :: DynFlags -> HscEnv -> IO Id
 lookupMkIntegerName dflags hsc_env