diff options
| author | Ben.Lippmeier@anu.edu.au <unknown> | 2009-09-17 09:07:30 +0000 |
|---|---|---|
| committer | Ben.Lippmeier@anu.edu.au <unknown> | 2009-09-17 09:07:30 +0000 |
| commit | e17cf7ff32778f4e6b3622855f25426251e843d6 (patch) | |
| tree | 8d8617c94d40157656d28c675119190eca0f838e /compiler/nativeGen/RegAlloc/Graph/SpillClean.hs | |
| parent | 028c032b60567b8cd501e9d7248e4aa86088a19b (diff) | |
| download | haskell-e17cf7ff32778f4e6b3622855f25426251e843d6.tar.gz | |
NCG: Refactor representation of code with liveness info
* I've pushed the SPILL and RELOAD instrs down into the
LiveInstr type to make them easier to work with.
* When the graph allocator does a spill cycle it now just
re-annotates the LiveCmmTops instead of converting them
to NatCmmTops and back.
* This saves working out the SCCS again, and avoids rewriting
the SPILL and RELOAD meta instructions into real machine
instructions.
Diffstat (limited to 'compiler/nativeGen/RegAlloc/Graph/SpillClean.hs')
| -rw-r--r-- | compiler/nativeGen/RegAlloc/Graph/SpillClean.hs | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/compiler/nativeGen/RegAlloc/Graph/SpillClean.hs b/compiler/nativeGen/RegAlloc/Graph/SpillClean.hs index 15fbb59e34..11e3cef10f 100644 --- a/compiler/nativeGen/RegAlloc/Graph/SpillClean.hs +++ b/compiler/nativeGen/RegAlloc/Graph/SpillClean.hs @@ -158,16 +158,16 @@ cleanForward _ _ acc [] -- cleanForward blockId assoc acc (li1 : li2 : instrs) - | SPILL reg1 slot1 <- li1 - , RELOAD slot2 reg2 <- li2 + | LiveInstr (SPILL reg1 slot1) _ <- li1 + , LiveInstr (RELOAD slot2 reg2) _ <- li2 , slot1 == slot2 = do modify $ \s -> s { sCleanedReloadsAcc = sCleanedReloadsAcc s + 1 } cleanForward blockId assoc acc - (li1 : Instr (mkRegRegMoveInstr reg1 reg2) Nothing : instrs) + (li1 : LiveInstr (mkRegRegMoveInstr reg1 reg2) Nothing : instrs) -cleanForward blockId assoc acc (li@(Instr i1 _) : instrs) +cleanForward blockId assoc acc (li@(LiveInstr i1 _) : instrs) | Just (r1, r2) <- takeRegRegMoveInstr i1 = if r1 == r2 -- erase any left over nop reg reg moves while we're here @@ -187,35 +187,32 @@ cleanForward blockId assoc acc (li@(Instr i1 _) : instrs) cleanForward blockId assoc acc (li : instrs) -- update association due to the spill - | SPILL reg slot <- li + | LiveInstr (SPILL reg slot) _ <- li = let assoc' = addAssoc (SReg reg) (SSlot slot) $ delAssoc (SSlot slot) $ assoc in cleanForward blockId assoc' (li : acc) instrs -- clean a reload instr - | RELOAD{} <- li + | LiveInstr (RELOAD{}) _ <- li = do (assoc', mli) <- cleanReload blockId assoc li case mli of Nothing -> cleanForward blockId assoc' acc instrs Just li' -> cleanForward blockId assoc' (li' : acc) instrs -- remember the association over a jump - | Instr instr _ <- li + | LiveInstr instr _ <- li , targets <- jumpDestsOfInstr instr , not $ null targets = do mapM_ (accJumpValid assoc) targets cleanForward blockId assoc (li : acc) instrs -- writing to a reg changes its value. - | Instr instr _ <- li + | LiveInstr instr _ <- li , RU _ written <- regUsageOfInstr instr = let assoc' = foldr delAssoc assoc (map SReg $ nub written) in cleanForward blockId assoc' (li : acc) instrs --- bogus, to stop pattern match warning -cleanForward _ _ _ _ - = panic "RegAlloc.Graph.SpillClean.cleanForward: no match" -- | Try and rewrite a reload instruction to something more pleasing @@ -227,7 +224,7 @@ cleanReload -> LiveInstr instr -> CleanM (Assoc Store, Maybe (LiveInstr instr)) -cleanReload blockId assoc li@(RELOAD slot reg) +cleanReload blockId assoc li@(LiveInstr (RELOAD slot reg) _) -- if the reg we're reloading already has the same value as the slot -- then we can erase the instruction outright @@ -244,7 +241,7 @@ cleanReload blockId assoc li@(RELOAD slot reg) $ delAssoc (SReg reg) $ assoc - return (assoc', Just $ Instr (mkRegRegMoveInstr reg2 reg) Nothing) + return (assoc', Just $ LiveInstr (mkRegRegMoveInstr reg2 reg) Nothing) -- gotta keep this instr | otherwise @@ -306,12 +303,12 @@ cleanBackward' _ _ acc [] cleanBackward' reloadedBy noReloads acc (li : instrs) -- if nothing ever reloads from this slot then we don't need the spill - | SPILL _ slot <- li + | LiveInstr (SPILL _ slot) _ <- li , Nothing <- lookupUFM reloadedBy (SSlot slot) = do modify $ \s -> s { sCleanedSpillsAcc = sCleanedSpillsAcc s + 1 } cleanBackward noReloads acc instrs - | SPILL _ slot <- li + | LiveInstr (SPILL _ slot) _ <- li = if elementOfUniqSet slot noReloads -- we can erase this spill because the slot won't be read until after the next one @@ -325,7 +322,7 @@ cleanBackward' reloadedBy noReloads acc (li : instrs) cleanBackward noReloads' (li : acc) instrs -- if we reload from a slot then it's no longer unused - | RELOAD slot _ <- li + | LiveInstr (RELOAD slot _) _ <- li , noReloads' <- delOneFromUniqSet noReloads slot = cleanBackward noReloads' (li : acc) instrs |
