summaryrefslogtreecommitdiff
path: root/compiler/GHC/Core/Opt/Simplify.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Core/Opt/Simplify.hs')
-rw-r--r--compiler/GHC/Core/Opt/Simplify.hs19
1 files changed, 13 insertions, 6 deletions
diff --git a/compiler/GHC/Core/Opt/Simplify.hs b/compiler/GHC/Core/Opt/Simplify.hs
index 1bbb728de6..dc0aa58e20 100644
--- a/compiler/GHC/Core/Opt/Simplify.hs
+++ b/compiler/GHC/Core/Opt/Simplify.hs
@@ -61,7 +61,7 @@ import GHC.Builtin.PrimOps ( PrimOp (SeqOp) )
import GHC.Builtin.Types.Prim( realWorldStatePrimTy )
import GHC.Builtin.Names( runRWKey )
-import GHC.Data.Maybe ( isNothing, orElse )
+import GHC.Data.Maybe ( isNothing, orElse, isJust )
import GHC.Data.FastString
import GHC.Unit.Module ( moduleName, pprModuleName )
import GHC.Utils.Outputable
@@ -73,6 +73,8 @@ import GHC.Utils.Monad ( mapAccumLM, liftIO )
import GHC.Utils.Logger
import Control.Monad
+import GHC.LanguageExtensions
+import GHC.Stack.Types
{-
@@ -666,7 +668,7 @@ tryCastWorkerWrapper env top_lvl old_bndr occ_info bndr (Cast rhs co)
_ -> mkLetUnfolding (sm_uf_opts mode) top_lvl InlineRhs work_id work_rhs
tryCastWorkerWrapper env _ _ _ bndr rhs -- All other bindings
- = return (mkFloatBind env (NonRec bndr rhs))
+ = (mkFloatBind env (NonRec bndr rhs))
mkCastWrapperInlinePrag :: InlinePragma -> InlinePragma
-- See Note [Cast worker/wrapper]
@@ -806,15 +808,20 @@ makeTrivialBinding :: SimplMode -> TopLevelFlag
-> OutType -- Type of the expression
-> SimplM (LetFloats, OutId)
makeTrivialBinding mode top_lvl occ_fs info expr expr_ty
- = do { (floats, expr1) <- prepareRhs mode top_lvl occ_fs expr
+ = do { dflags <- getDynFlags
+ ; let is_static = xopt StaticPointers dflags && isJust (collectMakeStaticArgs expr)
+ ; (floats, expr1) <- prepareRhs mode top_lvl occ_fs expr
; uniq <- getUniqueM
- ; let name = mkSystemVarName uniq occ_fs
- var = mkLocalIdWithInfo name Many expr_ty info
+ ; let var
+ | is_static = mkExportedVanillaId (mkSystemVarName uniq (mkFastString "static_ptr"))
+ expr_ty
+ | otherwise = mkLocalIdWithInfo (mkSystemVarName uniq occ_fs) Many expr_ty info
-- Now something very like completeBind,
-- but without the postInlineUnconditionally part
; (arity_type, expr2) <- tryEtaExpandRhs mode var expr1
; unf <- mkLetUnfolding (sm_uf_opts mode) top_lvl InlineRhs var expr2
+ ; pprTraceM "makeTrivial" (ppr floats $$ ppr expr2 $$ ppr expr1 $$ ppr expr $$ ppr is_static)
; let final_id = addLetBndrInfo var arity_type unf
bind = NonRec final_id expr2
@@ -896,7 +903,7 @@ completeBind env top_lvl mb_cont old_bndr new_bndr new_rhs
| isCoVar old_bndr
= case new_rhs of
Coercion co -> return (emptyFloats env, extendCvSubst env old_bndr co)
- _ -> return (mkFloatBind env (NonRec new_bndr new_rhs))
+ _ -> (mkFloatBind env (NonRec new_bndr new_rhs))
| otherwise
= assert (isId new_bndr) $