Second working draft of a CPS algorithm for C--.
[ghc-hetmet.git] / compiler / cmm / Cmm.hs
index a6c3ec4..5ad8ee7 100644 (file)
@@ -10,7 +10,7 @@ module Cmm (
        GenCmm(..), Cmm,
        GenCmmTop(..), CmmTop,
        GenBasicBlock(..), CmmBasicBlock, blockId, blockStmts,
-       CmmStmt(..),  
+       CmmStmt(..), CmmActuals, CmmFormals,
        CmmCallTarget(..),
        CmmStatic(..), Section(..),
        CmmExpr(..), cmmExprRep, 
@@ -20,7 +20,7 @@ module Cmm (
        BlockId(..),
        GlobalReg(..), globalRegRep,
 
-       node, nodeReg, spReg, hpReg,
+       node, nodeReg, spReg, hpReg, spLimReg
   ) where
 
 #include "HsVersions.h"
@@ -113,8 +113,8 @@ data CmmStmt
 
   | CmmCall                     -- A foreign call, with 
      CmmCallTarget
-     [(CmmReg,MachHint)]        -- zero or more results
-     [(CmmExpr,MachHint)]       -- zero or more arguments
+     CmmFormals                         -- zero or more results
+     CmmActuals                         -- zero or more arguments
      (Maybe [GlobalReg])        -- Global regs that may need to be saved
                                 -- if they will be clobbered by the call.
                                 -- Nothing <=> save *all* globals that
@@ -130,8 +130,14 @@ data CmmStmt
        --      one  -> second block etc
        -- Undefined outside range, and when there's a Nothing
 
-  | CmmJump CmmExpr [LocalReg]    -- Jump to another function, with these 
-                                 -- parameters.
+  | CmmJump CmmExpr               -- Jump to another function,
+    CmmActuals                    -- with these parameters.
+
+  | CmmReturn                     -- Return from a function,
+    CmmActuals                    -- with these return values.
+
+type CmmActuals = [(CmmExpr,MachHint)]
+type CmmFormals = [(CmmReg,MachHint)]
 
 {-
 Discussion
@@ -269,6 +275,8 @@ newtype BlockId = BlockId Unique
 instance Uniquable BlockId where
   getUnique (BlockId u) = u
 
+type BlockEnv a = UniqFM {- BlockId -} a
+
 -----------------------------------------------------------------------------
 --             Static Data
 -----------------------------------------------------------------------------
@@ -345,9 +353,10 @@ data GlobalReg
         )
 
 -- convenient aliases
-spReg, hpReg, nodeReg :: CmmReg
+spReg, hpReg, spLimReg, nodeReg :: CmmReg
 spReg = CmmGlobal Sp
 hpReg = CmmGlobal Hp
+spLimReg = CmmGlobal SpLim
 nodeReg = CmmGlobal node
 
 node :: GlobalReg