import qualified "transformers" Control.Monad.Trans as Trans
import qualified Control.Monad as Monad
import qualified Control.Monad.Trans.Writer as Writer
+import qualified Data.Accessor.Monad.Trans.State as MonadState
import qualified Data.Monoid as Monoid
+import qualified Data.Map as Map
-- GHC API
import CoreSyn
-- all occurences of the binder with the scrutinee variable.
scrutbndrremove (Case (Var scrut) bndr ty alts) | bndr_used = do
alts' <- mapM subs_bndr alts
- return $ Case (Var scrut) wild ty alts'
+ change $ Case (Var scrut) wild ty alts'
where
is_used (_, _, expr) = expr_uses_binders [bndr] expr
bndr_used = or $ map is_used alts
let newbody = MkCore.mkCoreLams newparams (MkCore.mkCoreApps body oldargs)
-- Create a new function with the same name but a new body
newf <- Trans.lift $ mkFunction f newbody
+
+ Trans.lift $ MonadState.modify tsInitStates (\ismap ->
+ let init_state_maybe = Map.lookup f ismap in
+ case init_state_maybe of
+ Nothing -> ismap
+ Just init_state -> Map.insert newf init_state ismap)
-- Replace the original application with one of the new function to the
-- new arguments.
change $ MkCore.mkCoreApps (Var newf) newargs
let free_vars = VarSet.varSetElems $ CoreFVs.exprSomeFreeVars interesting arg
-- Mark the current expression as changed
setChanged
+ -- TODO: Clone the free_vars (and update references in arg), since
+ -- this might cause conflicts if two arguments that are propagated
+ -- share a free variable. Also, we are now introducing new variables
+ -- into a function that are not fresh, which violates the binder
+ -- uniqueness invariant.
return (map Var free_vars, free_vars, arg)
else do
-- Representable types will not be propagated, and arguments with free
-- a different error if this happens down in the recursion.
error $ "\nNormalize.normalizeBind: Function " ++ show bndr ++ " is polymorphic, can't normalize"
else do
- expr <- getBinding bndr
+ Just expr <- getGlobalBind bndr
normalizeExpr (show bndr) expr
-- | Normalize an expression
trace ("\n" ++ what ++ " after normalization:\n\n" ++ showSDoc ( ppr expr')) $ return ()
return expr'
--- | Get the value that is bound to the given binder at top level. Fails when
--- there is no such binding.
-getBinding ::
- CoreBndr -- ^ The binder to get the expression for
- -> TranslatorSession CoreExpr -- ^ The value bound to the binder
-
-getBinding bndr = Utils.makeCached bndr tsBindings $
- -- If the binding isn't in the "cache" (bindings map), then we can't create
- -- it out of thin air, so return an error.
- error $ "Normalize.getBinding: Unknown function requested: " ++ show bndr
-
-- | Split a normalized expression into the argument binders, top level
-- bindings and the result binder.
splitNormalized ::