X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FnativeGen%2FRegAllocStats.hs;h=12f4cee3a0cd47fd0b1065a6d57e2943e2dc7634;hb=0df5099f0c2088e2ccbb5b8974a7eae4d77eaa1c;hp=728225abb938120b1e7071cac936670f4cb86561;hpb=272f0ba89eca1d9fc700cf4c27b9f8c3e23d6fe8;p=ghc-hetmet.git diff --git a/compiler/nativeGen/RegAllocStats.hs b/compiler/nativeGen/RegAllocStats.hs index 728225a..12f4cee 100644 --- a/compiler/nativeGen/RegAllocStats.hs +++ b/compiler/nativeGen/RegAllocStats.hs @@ -1,7 +1,7 @@ +{-# OPTIONS -fno-warn-missing-signatures #-} -- Carries interesting info for debugging / profiling of the -- graph coloring register allocator. -- -{-# OPTIONS -fno-warn-missing-signatures #-} module RegAllocStats ( RegAllocStats (..), @@ -24,6 +24,7 @@ import qualified GraphColor as Color import RegLiveness import RegAllocInfo import RegSpill +import RegSpillCost import MachRegs import MachInstrs import Cmm @@ -40,25 +41,26 @@ data RegAllocStats -- initial graph = RegAllocStatsStart { raLiveCmm :: [LiveCmmTop] -- ^ initial code, with liveness - , raGraph :: Color.Graph Reg RegClass Reg -- ^ the initial, uncolored graph - , raLifetimes :: UniqFM (Reg, Int) } -- ^ number of instrs each reg lives for + , raGraph :: Color.Graph Reg RegClass Reg -- ^ the initial, uncolored graph + , raSpillCosts :: SpillCostInfo } -- ^ information to help choose which regs to spill -- a spill stage | RegAllocStatsSpill { raGraph :: Color.Graph Reg RegClass Reg -- ^ the partially colored graph , raCoalesced :: UniqFM Reg -- ^ the regs that were coaleced , raSpillStats :: SpillStats -- ^ spiller stats - , raLifetimes :: UniqFM (Reg, Int) -- ^ number of instrs each reg lives for + , raSpillCosts :: SpillCostInfo -- ^ number of instrs each reg lives for , raSpilled :: [LiveCmmTop] } -- ^ code with spill instructions added -- a successful coloring | RegAllocStatsColored - { raGraph :: Color.Graph Reg RegClass Reg -- ^ the colored graph + { raGraph :: Color.Graph Reg RegClass Reg -- ^ the uncolored graph + , raGraphColored :: Color.Graph Reg RegClass Reg -- ^ the coalesced and colored graph , raCoalesced :: UniqFM Reg -- ^ the regs that were coaleced , raPatched :: [LiveCmmTop] -- ^ code with vregs replaced by hregs - , raSpillClean :: [LiveCmmTop] -- ^ code with unneeded spill/reloads cleaned out + , raSpillClean :: [LiveCmmTop] -- ^ code with unneeded spill\/reloads cleaned out , raFinal :: [NatCmmTop] -- ^ final code - , raSRMs :: (Int, Int, Int) } -- ^ spill/reload/reg-reg moves present in this code + , raSRMs :: (Int, Int, Int) } -- ^ spill\/reload\/reg-reg moves present in this code instance Outputable RegAllocStats where @@ -84,6 +86,10 @@ instance Outputable RegAllocStats where $$ text "" else empty) + $$ text "# Spill costs. reg uses defs lifetime degree cost" + $$ vcat (map (pprSpillCostRecord (raGraph s)) $ eltsUFM $ raSpillCosts s) + $$ text "" + $$ text "# Spills inserted." $$ ppr (raSpillStats s) $$ text "" @@ -95,10 +101,14 @@ instance Outputable RegAllocStats where ppr (s@RegAllocStatsColored { raSRMs = (spills, reloads, moves) }) = text "# Colored" - $$ text "# Register conflict graph." + $$ text "# Register conflict graph (initial)." $$ Color.dotGraph regDotColor trivColorable (raGraph s) $$ text "" + $$ text "# Register conflict graph (colored)." + $$ Color.dotGraph regDotColor trivColorable (raGraphColored s) + $$ text "" + $$ (if (not $ isNullUFM $ raCoalesced s) then text "# Registers coalesced." $$ (vcat $ map ppr $ ufmToList $ raCoalesced s) @@ -133,7 +143,7 @@ pprStats stats graph in vcat [outSpills, outLife, outConflict, outScatter] --- | Dump a table of how many spill loads / stores were inserted for each vreg. +-- | Dump a table of how many spill loads \/ stores were inserted for each vreg. pprStatsSpills :: [RegAllocStats] -> SDoc @@ -141,7 +151,7 @@ pprStatsSpills stats = let finals = [ s | s@RegAllocStatsColored{} <- stats] - -- sum up how many stores/loads/reg-reg-moves were left in the code + -- sum up how many stores\/loads\/reg-reg-moves were left in the code total = foldl' addSRM (0, 0, 0) $ map raSRMs finals @@ -156,9 +166,11 @@ pprStatsLifetimes :: [RegAllocStats] -> SDoc pprStatsLifetimes stats - = let lifeMap = foldl' plusUFM emptyUFM - [ raLifetimes s | s@RegAllocStatsStart{} <- stats ] - lifeBins = binLifetimeCount lifeMap + = let info = foldl' plusSpillCostInfo zeroSpillCostInfo + [ raSpillCosts s + | s@RegAllocStatsStart{} <- stats ] + + lifeBins = binLifetimeCount $ lifeMapFromSpillCostInfo info in ( text "-- vreg-population-lifetimes" $$ text "-- (instruction_count, number_of_vregs_that_lived_that_long)" @@ -201,8 +213,9 @@ pprStatsLifeConflict -> SDoc pprStatsLifeConflict stats graph - = let lifeMap = foldl' plusUFM emptyUFM - [ raLifetimes s | s@RegAllocStatsStart{} <- stats ] + = let lifeMap = lifeMapFromSpillCostInfo + $ foldl' plusSpillCostInfo zeroSpillCostInfo + $ [ raSpillCosts s | s@RegAllocStatsStart{} <- stats ] scatter = map (\r -> let lifetime = case lookupUFM lifeMap r of Just (_, l) -> l @@ -278,11 +291,10 @@ regColors , (fake3, "#aa00aa") , (fake4, "#ff0055") , (fake5, "#5500ff") ] -#endif -- reg colors for x86_64 -#if x86_64_TARGET_ARCH +#elif x86_64_TARGET_ARCH regDotColor :: Reg -> SDoc regDotColor reg = let Just str = lookupUFM regColors reg @@ -304,16 +316,26 @@ regColors , (r15, "#002080") ] ++ zip (map RealReg [16..31]) (repeat "red") -#endif -- reg colors for ppc -#if powerpc_TARGET_ARCH +#elif powerpc_TARGET_ARCH +regDotColor :: Reg -> SDoc +regDotColor reg + = case regClass reg of + RcInteger -> text "blue" + RcFloat -> text "red" + RcDouble -> text "green" + +#elif sparc_TARGET_ARCH regDotColor :: Reg -> SDoc regDotColor reg = case regClass reg of RcInteger -> text "blue" RcFloat -> text "red" + RcDouble -> text "green" +#else +#error ToDo: regDotColor #endif