RegAlloc.Graph.Stats

ghc-7.0.4: The GHC API

RegAlloc.Graph.Stats

Description

Carries interesting info for debugging / profiling of the graph coloring register allocator.

Synopsis

- data RegAllocStats instr
  - = RegAllocStatsStart {
    - raLiveCmm :: [LiveCmmTop instr]
    - raGraph :: Graph VirtualReg RegClass RealReg
    - raSpillCosts :: SpillCostInfo
    }
  - | RegAllocStatsSpill {
    - raCode :: [LiveCmmTop instr]
    - raGraph :: Graph VirtualReg RegClass RealReg
    - raCoalesced :: UniqFM VirtualReg
    - raSpillStats :: SpillStats
    - raSpillCosts :: SpillCostInfo
    - raSpilled :: [LiveCmmTop instr]
    }
  - | RegAllocStatsColored {
    - raCode :: [LiveCmmTop instr]
    - raGraph :: Graph VirtualReg RegClass RealReg
    - raGraphColored :: Graph VirtualReg RegClass RealReg
    - raCoalesced :: UniqFM VirtualReg
    - raCodeCoalesced :: [LiveCmmTop instr]
    - raPatched :: [LiveCmmTop instr]
    - raSpillClean :: [LiveCmmTop instr]
    - raFinal :: [NatCmmTop instr]
    - raSRMs :: (Int, Int, Int)
    }
- pprStats :: [RegAllocStats instr] -> Graph VirtualReg RegClass RealReg -> SDoc
- pprStatsSpills :: [RegAllocStats instr] -> SDoc
- pprStatsLifetimes :: [RegAllocStats instr] -> SDoc
- pprStatsConflict :: [RegAllocStats instr] -> SDoc
- pprStatsLifeConflict :: [RegAllocStats instr] -> Graph VirtualReg RegClass RealReg -> SDoc
- countSRMs :: Instruction instr => LiveCmmTop instr -> (Int, Int, Int)
- addSRM :: (Num t1, Num t2, Num t) => (t, t1, t2) -> (t, t1, t2) -> (t, t1, t2)

# Documentation

data RegAllocStats instr

Constructors

RegAllocStatsStart | information to help choose which regs to spill
Fields raLiveCmm :: [LiveCmmTop instr] initial code, with liveness raGraph :: Graph VirtualReg RegClass RealReg the initial, uncolored graph raSpillCosts :: SpillCostInfo
RegAllocStatsSpill | code with spill instructions added
Fields raCode :: [LiveCmmTop instr] the code we tried to allocate registers for raGraph :: Graph VirtualReg RegClass RealReg the initial, uncolored graph raCoalesced :: UniqFM VirtualReg the regs that were coaleced raSpillStats :: SpillStats spiller stats raSpillCosts :: SpillCostInfo raSpilled :: [LiveCmmTop instr]
RegAllocStatsColored | spill/reload/reg-reg moves present in this code
Fields raCode :: [LiveCmmTop instr] the code we tried to allocate registers for raGraph :: Graph VirtualReg RegClass RealReg the initial, uncolored graph raGraphColored :: Graph VirtualReg RegClass RealReg the coalesced and colored graph raCoalesced :: UniqFM VirtualReg the regs that were coaleced raCodeCoalesced :: [LiveCmmTop instr] code with coalescings applied raPatched :: [LiveCmmTop instr] code with vregs replaced by hregs raSpillClean :: [LiveCmmTop instr] code with unneeded spill/reloads cleaned out raFinal :: [NatCmmTop instr] final code raSRMs :: (Int, Int, Int)

Instances

Outputable instr => Outputable (RegAllocStats instr) |

pprStats :: [RegAllocStats instr] -> Graph VirtualReg RegClass RealReg -> SDoc

Do all the different analysis on this list of RegAllocStats

pprStatsSpills :: [RegAllocStats instr] -> SDoc

Dump a table of how many spill loads / stores were inserted for each vreg.

pprStatsLifetimes :: [RegAllocStats instr] -> SDoc

Dump a table of how long vregs tend to live for in the initial code.

pprStatsConflict :: [RegAllocStats instr] -> SDoc

Dump a table of how many conflicts vregs tend to have in the initial code.

pprStatsLifeConflict

Arguments

:: [RegAllocStats instr] |
-> Graph VirtualReg RegClass RealReg | global register conflict graph
-> SDoc |

For every vreg, dump it's how many conflicts it has and its lifetime good for making a scatter plot.

countSRMs :: Instruction instr => LiveCmmTop instr -> (Int, Int, Int)

Count spillreloadreg-reg moves. Lets us see how well the register allocator has done.

addSRM :: (Num t1, Num t2, Num t) => (t, t1, t2) -> (t, t1, t2) -> (t, t1, t2)