- 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
- }
- }
- where dual_rewrite u pass g = runDFM u dualLiveLattice $ b_rewrite pass g
- extend (LGraph eid blocks) = Graph (ZLast $ mkBranchNode eid) blocks
- trim _ (Graph (ZLast (LastOther (LastBranch id))) blocks) = LGraph id blocks
- trim e (Graph tail blocks) = LGraph e (insertBlock (Block e tail) blocks)
+ g <- dual_rewrite Opt_D_dump_cmmz "spills and reloads"
+ (dualLivenessWithInsertion procPoints) g
+ -- Insert spills at defns; reloads at return points
+ g <- run $ insertLateReloads' g -- Duplicate reloads just before uses
+ dump Opt_D_dump_cmmz "Post late reloads" g
+ g <- trim g >>= dual_rewrite Opt_D_dump_cmmz "Dead Assignment Elimination"
+ (removeDeadAssignmentsAndReloads procPoints)
+ -- Remove redundant reloads (and any other redundant asst)
+ (_, g) <- trim g >>= run . elimSpillAndReload varSlots
+ gs <- run $ splitAtProcPoints args l procPoints g
+ gs `seq` dump Opt_D_dump_cmmz "Pre common block elimination" g
+ g <- return $ elimCommonBlocks g
+ dump Opt_D_dump_cmmz "Post common block elimination" g
+ return $ CmmProc h l args (runTx cmmCfgOptsZ g)
+ where dflags = hsc_dflags hsc_env
+ dump f txt g = dumpIfSet_dyn dflags f txt (ppr g)
+ run = runFuelIO (hsc_OptFuel hsc_env)
+ dual_rewrite flag txt pass g =
+ do dump flag ("Pre " ++ txt) g
+ g <- run $ pass (graphOfLGraph g) >>= lGraphOfGraph
+ dump flag ("Post " ++ txt) $ g
+ return $ graphOfLGraph g
+ trim (Graph (ZLast (LastOther (LastBranch id))) blocks) = return $ LGraph id blocks
+ trim (Graph tail blocks) =
+ do entry <- liftM BlockId $ run $ getUniqueM
+ return $ LGraph entry (insertBlock (Block entry tail) blocks)