X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FCmmCPSZ.hs;h=3d8ac22f5342eed0cee35ca8bab95f47b761d30b;hb=dcf739bd7fb7de140be3bafb4ce211e2e5c7bba9;hp=35c20c048e0cbb558c7a1b9c2aa7e244eacf72d9;hpb=fee569a69a4ce8c8d05b8a1fb8069d804dbd2b9c;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmCPSZ.hs b/compiler/cmm/CmmCPSZ.hs index 35c20c0..3d8ac22 100644 --- a/compiler/cmm/CmmCPSZ.hs +++ b/compiler/cmm/CmmCPSZ.hs @@ -1,4 +1,3 @@ - module CmmCPSZ ( -- | Converts C-- with full proceedures and parameters -- to a CPS transformed C-- with the stack made manifest. @@ -31,6 +30,9 @@ protoCmmCPSZ :: DynFlags -- ^ Dynamic flags: -dcmm-lint -ddump-cps-cmm -> CmmZ -- ^ Input C-- with Proceedures -> IO CmmZ -- ^ Output CPS transformed C-- protoCmmCPSZ dflags (Cmm tops) + | not (dopt Opt_RunCPSZ dflags) + = return (Cmm tops) -- Only if -frun-cps + | otherwise = do { showPass dflags "CPSZ" ; u <- mkSplitUniqSupply 'p' ; pass_ref <- newIORef "unoptimized program" -- XXX see [Note global fuel] @@ -58,13 +60,17 @@ cpsTop (CmmProc h l args g) = let procPoints = minimalProcPointSet (runTx cmmCfgOptsZ g) g' = addProcPointProtocols procPoints args g g'' = map_nodes id NotSpillOrReload id g' + -- Change types of middle nodes to allow spill/reload in do { u1 <- getUs; u2 <- getUs; u3 <- getUs ; entry <- getUniqueUs >>= return . BlockId ; return $ do { g <- return g'' ; g <- dual_rewrite u1 dualLivenessWithInsertion g + -- Insert spills at defns; reloads at return points ; g <- insertLateReloads' u2 (extend g) + -- Duplicate reloads just before uses ; g <- dual_rewrite u3 removeDeadAssignmentsAndReloads (trim entry g) + -- Remove redundant reloads (and any other redundant asst) ; return $ CmmProc h l args $ map_nodes id spillAndReloadComments id g } }