X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FnativeGen%2FRegAlloc%2FGraph%2FCoalesce.hs;h=8521e9260153956465fa1c7e08440a7d7c29b64d;hb=de29a9f02449359b70402f763ac7590673774124;hp=18e4b0edd1cb744880f0d2c7f8c0373e3fadfe5c;hpb=ee6bba6f3d80c56b47bc623bc6e4f076be1f046f;p=ghc-hetmet.git diff --git a/compiler/nativeGen/RegAlloc/Graph/Coalesce.hs b/compiler/nativeGen/RegAlloc/Graph/Coalesce.hs index 18e4b0e..8521e92 100644 --- a/compiler/nativeGen/RegAlloc/Graph/Coalesce.hs +++ b/compiler/nativeGen/RegAlloc/Graph/Coalesce.hs @@ -8,11 +8,11 @@ module RegAlloc.Graph.Coalesce ( where -import Cmm -import Regs import RegAlloc.Liveness -import RegAllocInfo +import Instruction +import Reg +import Cmm import Bag import UniqFM import UniqSet @@ -26,7 +26,11 @@ import Data.List -- then the mov only serves to join live ranges. The two regs can be renamed to be -- the same and the move instruction safely erased. -regCoalesce :: [LiveCmmTop] -> UniqSM [LiveCmmTop] +regCoalesce + :: Instruction instr + => [LiveCmmTop instr] + -> UniqSM [LiveCmmTop instr] + regCoalesce code = do let joins = foldl' unionBags emptyBag @@ -57,7 +61,11 @@ sinkReg fm r -- During a mov, if the source reg dies and the destiation reg is born -- then we can rename the two regs to the same thing and eliminate the move. -- -slurpJoinMovs :: LiveCmmTop -> Bag (Reg, Reg) +slurpJoinMovs + :: Instruction instr + => LiveCmmTop instr + -> Bag (Reg, Reg) + slurpJoinMovs live = slurpCmm emptyBag live where @@ -68,7 +76,7 @@ slurpJoinMovs live slurpLI rs (Instr _ Nothing) = rs slurpLI rs (Instr instr (Just live)) - | Just (r1, r2) <- isRegRegMove instr + | Just (r1, r2) <- takeRegRegMoveInstr instr , elementOfUniqSet r1 $ liveDieRead live , elementOfUniqSet r2 $ liveBorn live @@ -80,4 +88,7 @@ slurpJoinMovs live | otherwise = rs + slurpLI rs SPILL{} = rs + slurpLI rs RELOAD{} = rs +