Remove platform CPP from nativeGen/PPC/CodeGen.hs
[ghc-hetmet.git] / compiler / codeGen / StgCmmEnv.hs
index 67d82f0..369e199 100644 (file)
@@ -35,14 +35,13 @@ import StgCmmClosure
 import CLabel
 
 import BlockId
-import Cmm
+import CmmExpr
 import CmmUtils
+import MkGraph (CmmAGraph, mkAssign, (<*>))
 import FastString
-import PprCmm          ( {- instance Outputable -} )
 import Id
 import VarEnv
-import Maybes
-import Monad
+import Control.Monad
 import Name
 import StgSyn
 import Outputable
@@ -88,9 +87,16 @@ litIdInfo :: Id -> LambdaFormInfo -> CmmLit -> CgIdInfo
 litIdInfo id lf_info lit = --mkCgIdInfo id lf_info (CmmLit lit)
   mkCgIdInfo id lf_info (addDynTag (CmmLit lit) (lfDynTag lf_info))
 
-regIdInfo :: Id -> LambdaFormInfo -> LocalReg -> CgIdInfo
-regIdInfo id lf_info reg =
-  mkCgIdInfo id lf_info (addDynTag (CmmReg (CmmLocal reg)) (lfDynTag lf_info))
+-- Because the register may be spilled to the stack in untagged form, we
+-- modify the initialization code 'init' to immediately tag the
+-- register, and store a plain register in the CgIdInfo.  We allocate
+-- a new register in order to keep single-assignment and help out the
+-- inliner. -- EZY
+regIdInfo :: Id -> LambdaFormInfo -> LocalReg -> CmmAGraph -> FCode (CgIdInfo, CmmAGraph)
+regIdInfo id lf_info reg init = do
+  reg' <- newTemp (localRegType reg)
+  let init' = init <*> mkAssign (CmmLocal reg') (addDynTag (CmmReg (CmmLocal reg)) (lfDynTag lf_info))
+  return (mkCgIdInfo id lf_info (CmmReg (CmmLocal reg')), init')
 
 idInfoToAmode :: CgIdInfo -> CmmExpr
 -- Returns a CmmExpr for the *tagged* pointer