From f8c572418898d4c0e703f6d67510c9c37b51cc6e Mon Sep 17 00:00:00 2001 From: "Ben.Lippmeier@anu.edu.au" Date: Fri, 24 Aug 2007 15:21:42 +0000 Subject: [PATCH] Add a count of how many spill/reloads/reg-reg-moves remain to dump-asm-stats --- compiler/nativeGen/RegAllocColor.hs | 3 +- compiler/nativeGen/RegAllocStats.hs | 78 +++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 27 deletions(-) diff --git a/compiler/nativeGen/RegAllocColor.hs b/compiler/nativeGen/RegAllocColor.hs index 5a3401f..d5ec7af 100644 --- a/compiler/nativeGen/RegAllocColor.hs +++ b/compiler/nativeGen/RegAllocColor.hs @@ -125,7 +125,8 @@ regAlloc_spin dump (spinCount :: Int) triv regsFree slotsFree debug_codeGraphs c { raGraph = graph_colored , raPatched = code_patched , raSpillClean = code_spillclean - , raFinal = code_final } + , raFinal = code_final + , raSRMs = foldl addSRM (0, 0, 0) $ map countSRMs code_spillclean } return ( code_final , if dump diff --git a/compiler/nativeGen/RegAllocStats.hs b/compiler/nativeGen/RegAllocStats.hs index 7e08c1c..a38db1d 100644 --- a/compiler/nativeGen/RegAllocStats.hs +++ b/compiler/nativeGen/RegAllocStats.hs @@ -10,7 +10,9 @@ module RegAllocStats ( pprStatsSpills, pprStatsLifetimes, pprStatsConflict, - pprStatsLifeConflict + pprStatsLifeConflict, + + countSRMs, addSRM ) where @@ -19,13 +21,16 @@ where import qualified GraphColor as Color import RegLiveness +import RegAllocInfo import RegSpill import MachRegs import MachInstrs +import Cmm import Outputable import UniqFM import UniqSet +import State import Data.List @@ -49,7 +54,8 @@ data RegAllocStats { raGraph :: Color.Graph Reg RegClass Reg -- ^ the colored graph , raPatched :: [LiveCmmTop] -- ^ code with vregs replaced by hregs , raSpillClean :: [LiveCmmTop] -- ^ code with unneeded spill/reloads cleaned out - , raFinal :: [NatCmmTop] } -- ^ final code + , raFinal :: [NatCmmTop] -- ^ final code + , raSRMs :: (Int, Int, Int) } -- ^ spill/reload/reg-reg moves present in this code instance Outputable RegAllocStats where @@ -72,7 +78,7 @@ instance Outputable RegAllocStats where $$ text "# Code with spills inserted." $$ (ppr (raSpilled s)) - ppr (s@RegAllocStatsColored{}) + ppr (s@RegAllocStatsColored { raSRMs = (spills, reloads, moves) }) = text "# Colored" $$ text "# Register conflict graph." $$ Color.dotGraph regDotColor trivColorable (raGraph s) @@ -86,7 +92,11 @@ instance Outputable RegAllocStats where $$ text "# Final code, after rewriting spill/rewrite pseudo instrs." $$ ppr (raFinal s) $$ text "" - + $$ text "# Score:" + $$ (text "# spills inserted: " <> int spills) + $$ (text "# reloads inserted: " <> int reloads) + $$ (text "# reg-reg moves remaining: " <> int moves) + $$ text "" -- | Do all the different analysis on this list of RegAllocStats pprStats :: [RegAllocStats] -> Color.Graph Reg RegClass Reg -> SDoc @@ -104,31 +114,16 @@ pprStatsSpills :: [RegAllocStats] -> SDoc pprStatsSpills stats - = let -- slurp out the stats from all the spiller stages - spillStats = [ s | s@RegAllocStatsSpill{} <- stats] - - -- build a map of how many spill load/stores were inserted for each vreg - spillSL = foldl' (plusUFM_C accSpillSL) emptyUFM - $ map (spillStoreLoad . raSpillStats) spillStats + = let + finals = [ s | s@RegAllocStatsColored{} <- stats] - -- print the count of load/spills as a tuple so we can read back from the file easilly - pprSpillSL (r, loads, stores) - = (parens $ (hcat $ punctuate (text ", ") [doubleQuotes (ppr r), int loads, int stores])) - - -- sum up the total number of spill instructions inserted - spillList = eltsUFM spillSL - spillTotal = foldl' (\(s1, l1) (s2, l2) -> (s1 + s2, l1 + l2)) - (0, 0) - $ map (\(n, s, l) -> (s, l)) - $ spillList + -- sum up how many stores/loads/reg-reg-moves were left in the code + total = foldl' addSRM (0, 0, 0) + $ map raSRMs finals in ( text "-- spills-added-total" - $$ text "-- (stores, loads)" - $$ (ppr spillTotal) - $$ text "" - $$ text "-- spills-added" - $$ text "-- (reg_name, stores, loads)" - $$ (vcat $ map pprSpillSL $ spillList) + $$ text "-- (stores, loads, reg_reg_moves_remaining)" + $$ ppr total $$ text "") @@ -203,6 +198,37 @@ pprStatsLifeConflict stats graph $$ text "\n") +-- | Count spill/reload/reg-reg moves. +-- Lets us see how well the register allocator has done. +-- +countSRMs :: LiveCmmTop -> (Int, Int, Int) +countSRMs cmm + = execState (mapBlockTopM countSRM_block cmm) (0, 0, 0) + +countSRM_block (BasicBlock i instrs) + = do instrs' <- mapM countSRM_instr instrs + return $ BasicBlock i instrs' + +countSRM_instr li@(Instr instr live) + | SPILL reg slot <- instr + = do modify $ \(s, r, m) -> (s + 1, r, m) + return li + + | RELOAD slot reg <- instr + = do modify $ \(s, r, m) -> (s, r + 1, m) + return li + + | Just _ <- isRegRegMove instr + = do modify $ \(s, r, m) -> (s, r, m + 1) + return li + + | otherwise + = return li + +-- sigh.. +addSRM (s1, r1, m1) (s2, r2, m2) + = (s1+s2, r1+r2, m1+m2) + ----- -- Register colors for drawing conflict graphs -- Keep this out of MachRegs.hs because it's specific to the graph coloring allocator. -- 1.7.10.4