Remove platform CPP from nativeGen/PPC/CodeGen.hs
[ghc-hetmet.git] / compiler / codeGen / StgCmmEnv.hs
index 469f58d..369e199 100644 (file)
@@ -37,6 +37,7 @@ import CLabel
 import BlockId
 import CmmExpr
 import CmmUtils
+import MkGraph (CmmAGraph, mkAssign, (<*>))
 import FastString
 import Id
 import VarEnv
@@ -86,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