X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FMkZipCfgCmm.hs;h=d52b32ed56889f8fcaf3e7fa25a855e70e26d02b;hb=4b0d51372d354687f0b2f7b2c2583bed059ce315;hp=f83444922b1e3fb045df1c8efc79d3eaf1534279;hpb=09a416591da9ad89e0e6ca85e5093b6eb629a98e;p=ghc-hetmet.git diff --git a/compiler/cmm/MkZipCfgCmm.hs b/compiler/cmm/MkZipCfgCmm.hs index f834449..d52b32e 100644 --- a/compiler/cmm/MkZipCfgCmm.hs +++ b/compiler/cmm/MkZipCfgCmm.hs @@ -7,9 +7,10 @@ module MkZipCfgCmm ( mkNop, mkAssign, mkStore, mkCall, mkCmmCall, mkUnsafeCall, mkFinalCall - , mkJump, mkCbranch, mkSwitch, mkReturn, mkComment, mkCmmIfThenElse - , mkCmmWhileDo - , (<*>), sequence, mkLabel, mkBranch + , mkJump, mkCbranch, mkSwitch, mkReturn, mkComment + , mkCmmIfThenElse, mkCmmIfThen, mkCmmWhileDo + , mkAddToContext + , (<*>), catAGraphs, mkLabel, mkBranch , emptyAGraph, withFreshLabel, withUnique, outOfLine , lgraphOfAGraph, graphOfAGraph, labelAGraph , CmmZ, CmmTopZ, CmmGraph, CmmBlock, CmmAGraph, Middle, Last, Convention(..) @@ -31,7 +32,6 @@ import FastString import ForeignCall import ZipCfg import MkZipCfg -import Prelude hiding( sequence ) type CmmGraph = LGraph Middle Last type CmmAGraph = AGraph Middle Last @@ -55,12 +55,17 @@ mkUnsafeCall :: CmmCallTarget -> CmmFormals -> CmmActuals -> CmmAGraph mkFinalCall :: CmmExpr -> CCallConv -> CmmActuals -> CmmAGraph -- Never returns; like exit() or barf() +---------- Context manipulation ('return via') +mkAddToContext :: CmmExpr -> [CmmExpr] -> CmmAGraph + ---------- Control transfer mkJump :: CmmExpr -> CmmActuals -> CmmAGraph mkCbranch :: CmmExpr -> BlockId -> BlockId -> CmmAGraph mkSwitch :: CmmExpr -> [Maybe BlockId] -> CmmAGraph mkReturn :: CmmActuals -> CmmAGraph + mkCmmIfThenElse :: CmmExpr -> CmmAGraph -> CmmAGraph -> CmmAGraph +mkCmmIfThen :: CmmExpr -> CmmAGraph -> CmmAGraph mkCmmWhileDo :: CmmExpr -> CmmAGraph -> CmmAGraph -- Not to be forgotten, but exported by MkZipCfg: @@ -72,13 +77,21 @@ mkCmmWhileDo :: CmmExpr -> CmmAGraph -> CmmAGraph -------------------------------------------------------------------------- +mkCmmWhileDo e = mkWhileDo (mkCbranch e) mkCmmIfThenElse e = mkIfThenElse (mkCbranch e) -mkCmmWhileDo e = mkWhileDo (mkCbranch e) + +mkCmmIfThen e tbranch + = withFreshLabel "end of if" $ \endif -> + withFreshLabel "start of then" $ \tid -> + mkCbranch e tid endif <*> + mkLabel tid <*> tbranch <*> mkBranch endif <*> + mkLabel endif + -- ================ IMPLEMENTATION ================-- -mkNop = emptyAgraph +mkNop = emptyAGraph mkComment fs = mkMiddle $ MidComment fs mkAssign l r = mkMiddle $ MidAssign l r mkStore l r = mkMiddle $ MidStore l r @@ -87,6 +100,7 @@ mkCbranch pred ifso ifnot = mkLast $ LastCondBranch pred ifso ifnot mkSwitch e tbl = mkLast $ LastSwitch e tbl mkUnsafeCall tgt results actuals = mkMiddle $ MidUnsafeCall tgt results actuals +mkAddToContext ra actuals = mkMiddle $ MidAddToContext ra actuals cmmArgConv, cmmResConv :: Convention cmmArgConv = ConventionStandard CmmCallConv Arguments