X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FnativeGen%2FRegAllocStats.hs;h=58a69fa76e92ce8c2f3200c95b11084271ecee89;hb=58de6cb725982dd1f57803cc838f233d5fd9c42c;hp=728225abb938120b1e7071cac936670f4cb86561;hpb=272f0ba89eca1d9fc700cf4c27b9f8c3e23d6fe8;p=ghc-hetmet.git diff --git a/compiler/nativeGen/RegAllocStats.hs b/compiler/nativeGen/RegAllocStats.hs index 728225a..58a69fa 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,20 +41,21 @@ 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 @@ -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) @@ -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,19 @@ 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" + +#else +#error ToDo: regDotColor #endif