X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FZipCfgCmmRep.hs;h=c5464e2b42bf464fb455a5e32b7183cfb2abd3cf;hb=fee569a69a4ce8c8d05b8a1fb8069d804dbd2b9c;hp=d4ed3cfde9c9906e5d9172456e696aed1ec49eba;hpb=4ddba4629c5396bec766b598fe32d874a378d7bb;p=ghc-hetmet.git diff --git a/compiler/cmm/ZipCfgCmmRep.hs b/compiler/cmm/ZipCfgCmmRep.hs index d4ed3cf..c5464e2 100644 --- a/compiler/cmm/ZipCfgCmmRep.hs +++ b/compiler/cmm/ZipCfgCmmRep.hs @@ -25,7 +25,7 @@ import ClosureInfo import FastString import ForeignCall import MachOp -import qualified ZipDataflow as DF +import qualified ZipDataflow0 as DF import ZipCfg import MkZipCfg @@ -43,8 +43,7 @@ type CmmZ = GenCmm CmmStatic CmmInfo CmmGraph type CmmTopZ = GenCmmTop CmmStatic CmmInfo CmmGraph data Middle - = MidNop - | MidComment FastString + = MidComment FastString | MidAssign CmmReg CmmExpr -- Assign to register @@ -56,6 +55,14 @@ data Middle CmmFormals -- zero or more results CmmActuals -- zero or more arguments + | MidAddToContext -- push a frame on the stack; + -- I will return to this frame + CmmExpr -- The frame's return address; it must be + -- preceded by an info table that describes the + -- live variables. + [CmmExpr] -- The frame's live variables, to go on the + -- stack with the first one at the young end + | CopyIn -- Move incoming parameters or results from conventional -- locations to registers. Note [CopyIn invariant] Convention @@ -152,6 +159,33 @@ fold_cmm_succs _f (LastCall _ Nothing) z = z fold_cmm_succs f (LastCondBranch _ te fe) z = f te (f fe z) fold_cmm_succs f (LastSwitch _ edges) z = foldl (flip f) z $ catMaybes edges +---------------------------------------------------------------------- +----- Instance declarations for register use + +instance UserOfLocalRegs Middle where + foldRegsUsed f z m = middle m + where middle (MidComment {}) = z + middle (MidAssign _lhs expr) = fold f z expr + middle (MidStore addr rval) = fold f (fold f z addr) rval + middle (MidUnsafeCall tgt _ress args) = fold f (fold f z tgt) args + middle (MidAddToContext ra args) = fold f (fold f z ra) args + middle (CopyIn _ _formals _) = z + middle (CopyOut _ actuals) = fold f z actuals + fold f z m = foldRegsUsed f z m -- avoid monomorphism restriction + +instance UserOfLocalRegs Last where + foldRegsUsed f z m = last m + where last (LastReturn) = z + last (LastJump e) = foldRegsUsed f z e + last (LastBranch _id) = z + last (LastCall tgt _) = foldRegsUsed f z tgt + last (LastCondBranch e _ _) = foldRegsUsed f z e + last (LastSwitch e _tbl) = foldRegsUsed f z e + +instance UserOfLocalRegs (ZLast Last) where + foldRegsUsed f z (LastOther l) = foldRegsUsed f z l + foldRegsUsed _f z LastExit = z + ---------------------------------------------------------------------- ----- Instance declarations for prettyprinting (avoids recursive imports) @@ -176,8 +210,6 @@ debugPpr = debugIsOn pprMiddle :: Middle -> SDoc pprMiddle stmt = (case stmt of - MidNop -> semi - CopyIn conv args _ -> if null args then ptext SLIT("empty CopyIn") else commafy (map pprHinted args) <+> equals <+> @@ -207,27 +239,34 @@ pprMiddle stmt = (case stmt of ptext SLIT(" = "), ptext SLIT("call"), space, doubleQuotes(ppr cconv), space, - target fn, parens ( commafy $ map ppr args ), + ppr_target fn, parens ( commafy $ map ppr args ), semi ] - where - target t@(CmmLit _) = ppr t - target fn' = parens (ppr fn') MidUnsafeCall (CmmPrim op) results args -> pprMiddle (MidUnsafeCall (CmmCallee (CmmLit lbl) CCallConv) results args) where lbl = CmmLabel (mkForeignLabel (mkFastString (show op)) Nothing False) + + MidAddToContext ra args -> + hcat [ ptext SLIT("return via ") + , ppr_target ra, parens (commafy $ map ppr args), semi ] + ) <> if debugPpr then empty else text " //" <+> case stmt of - MidNop {} -> text "MidNop" CopyIn {} -> text "CopyIn" CopyOut {} -> text "CopyOut" MidComment {} -> text "MidComment" MidAssign {} -> text "MidAssign" MidStore {} -> text "MidStore" - MidUnsafeCall {} -> text "MidUnsafeCall" + MidUnsafeCall {} -> text "MidUnsafeCall" + MidAddToContext {} -> text "MidAddToContext" + + +ppr_target :: CmmExpr -> SDoc +ppr_target t@(CmmLit _) = ppr t +ppr_target fn' = parens (ppr fn') pprHinted :: Outputable a => (a, MachHint) -> SDoc