Merging in the new codegen branch
[ghc-hetmet.git] / compiler / cmm / CmmCPS.hs
index 534346e..f00a93c 100644 (file)
@@ -1,3 +1,10 @@
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module CmmCPS (
   -- | Converts C-- with full proceedures and parameters
   -- to a CPS transformed C-- with the stack made manifest.
@@ -6,6 +13,7 @@ module CmmCPS (
 
 #include "HsVersions.h"
 
+import BlockId
 import Cmm
 import CmmLint
 import PprCmm
@@ -18,7 +26,6 @@ import CmmCPSGen
 import CmmUtils
 
 import ClosureInfo
-import MachOp
 import CLabel
 import SMRep
 import Constants
@@ -86,7 +93,7 @@ cpsProc uniqSupply proc@(CmmData _ _) = [proc]
 
 -- Empty functions just don't work with the CPS algorithm, but
 -- they don't need the transformation anyway so just output them directly
-cpsProc uniqSupply proc@(CmmProc _ _ _ []) 
+cpsProc uniqSupply proc@(CmmProc _ _ _ (ListGraph []))
   = pprTrace "cpsProc: unexpected empty proc" (ppr proc) [proc]
 
 -- CPS transform for those procs that actually need it
@@ -97,7 +104,7 @@ cpsProc uniqSupply proc@(CmmProc _ _ _ [])
 --   * Now break each block into a bunch of blocks (at call sites); 
 --     all but the first will be ContinuationEntry
 --
-cpsProc uniqSupply (CmmProc info ident params blocks) = cps_procs
+cpsProc uniqSupply (CmmProc info ident params (ListGraph blocks)) = cps_procs
     where
       -- We need to be generating uniques for several things.
       -- We could make this function monadic to handle that
@@ -110,7 +117,7 @@ cpsProc uniqSupply (CmmProc info ident params blocks) = cps_procs
        block_uniques = uniques
       proc_uniques = map (map (map uniqsFromSupply . listSplitUniqSupply) . listSplitUniqSupply) $ listSplitUniqSupply uniqSupply2
 
-      stack_use = CmmLocal (LocalReg stack_use_unique (cmmRegRep spReg) KindPtr)
+      stack_use = CmmLocal (LocalReg stack_use_unique (cmmRegType spReg))
       stack_check_block_id = BlockId stack_check_block_unique
       stack_check_block = make_stack_check stack_check_block_id info stack_use (blockId $ head blocks)
 
@@ -192,7 +199,7 @@ make_stack_check stack_check_block_id info stack_use next_block_id =
             -- then great, well check the stack.
             CmmInfo (Just gc_block) _ _
                 -> [CmmCondBranch
-                    (CmmMachOp (MO_U_Lt $ cmmRegRep spReg)
+                    (CmmMachOp (MO_U_Lt (typeWidth (cmmRegType spReg)))
                      [CmmReg stack_use, CmmReg spLimReg])
                     gc_block]
             -- If we aren't given a stack check handler,
@@ -322,7 +329,7 @@ processFormats formats update_frame continuations =
       update_size [] = 0
       update_size (expr:exprs) = width + update_size exprs
           where
-            width = machRepByteWidth (cmmExprRep expr) `quot` wORD_SIZE
+            width = (widthInBytes $ typeWidth $ cmmExprType expr) `quot` wORD_SIZE
             -- TODO: it would be better if we had a machRepWordWidth
 
       -- TODO: get rid of "+ 1" etc.
@@ -332,7 +339,7 @@ processFormats formats update_frame continuations =
       stack_size (Nothing:formats) = 1 + stack_size formats -- one dead word
       stack_size (Just reg:formats) = width + stack_size formats
           where
-            width = machRepByteWidth (localRegRep reg) `quot` wORD_SIZE
+            width = (widthInBytes $ typeWidth $ localRegType reg) `quot` wORD_SIZE
             -- TODO: it would be better if we had a machRepWordWidth
 
 continuationMaxStack :: [(CLabel, ContinuationFormat)]
@@ -352,14 +359,14 @@ continuationMaxStack formats (Continuation _ label _ False blocks) =
                    map stmt_arg_size (brokenBlockStmts block))
 
       final_arg_size (FinalReturn args) =
-          argumentsSize (cmmExprRep . fst) args
+          argumentsSize (cmmExprType . hintlessCmm) args
       final_arg_size (FinalJump _ args) =
-          argumentsSize (cmmExprRep . fst) args
+          argumentsSize (cmmExprType . hintlessCmm) args
       final_arg_size (FinalCall next _ _ args _ _ True) = 0
       final_arg_size (FinalCall next _ _ args _ _ False) =
           -- We have to account for the stack used when we build a frame
           -- for the *next* continuation from *this* continuation
-          argumentsSize (cmmExprRep . fst) args +
+          argumentsSize (cmmExprType . hintlessCmm) args +
           continuation_frame_size next_format
           where 
             next_format = maybe unknown_format id $ lookup next' formats
@@ -368,7 +375,7 @@ continuationMaxStack formats (Continuation _ label _ False blocks) =
       final_arg_size _ = 0
 
       stmt_arg_size (CmmJump _ args) =
-          argumentsSize (cmmExprRep . fst) args
+          argumentsSize (cmmExprType . hintlessCmm) args
       stmt_arg_size (CmmCall _ _ _ (CmmSafe _) _) =
           panic "Safe call in processFormats"
       stmt_arg_size (CmmReturn _) =