| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
RegAlloc.Linear.Base
Description
Put common type definitions here to break recursive module dependencies.
Synopsis
- type BlockAssignment freeRegs = BlockMap (freeRegs, RegMap Loc)
- data Loc
- regsOfLoc :: Loc -> [RealReg]
- data SpillReason
- = SpillAlloc !Unique
- | SpillClobber !Unique
- | SpillLoad !Unique
- | SpillJoinRR !Unique
- | SpillJoinRM !Unique
- data RegAllocStats = RegAllocStats {
- ra_spillInstrs :: UniqFM [Int]
- ra_fixupList :: [(BlockId, BlockId, BlockId)]
- data RA_State freeRegs = RA_State {
- ra_blockassig :: BlockAssignment freeRegs
- ra_freeregs :: !freeRegs
- ra_assig :: RegMap Loc
- ra_delta :: Int
- ra_stack :: StackMap
- ra_us :: UniqSupply
- ra_spills :: [SpillReason]
- ra_DynFlags :: DynFlags
- ra_fixups :: [(BlockId, BlockId, BlockId)]
Documentation
type BlockAssignment freeRegs = BlockMap (freeRegs, RegMap Loc) Source #
Used to store the register assignment on entry to a basic block. We use this to handle join points, where multiple branch instructions target a particular label. We have to insert fixup code to make the register assignments from the different sources match up.
Where a vreg is currently stored A temporary can be marked as living in both a register and memory (InBoth), for example if it was recently loaded from a spill location. This makes it cheap to spill (no save instruction required), but we have to be careful to turn this into InReg if the value in the register is changed.
Constructors
Instances
data SpillReason Source #
Reasons why instructions might be inserted by the spiller. Used when generating stats for -ddrop-asm-stats.
Constructors
data RegAllocStats Source #
Used to carry interesting stats out of the register allocator.
Constructors
Fields
- ra_spillInstrs :: UniqFM [Int]
- ra_fixupList :: [(BlockId, BlockId, BlockId)]
(from,fixup,to) : We inserted fixup code between from and to
data RA_State freeRegs Source #
The register allocator state
Constructors
Fields
- ra_blockassig :: BlockAssignment freeRegs
the current mapping from basic blocks to the register assignments at the beginning of that block.
- ra_freeregs :: !freeRegs
free machine registers
- ra_assig :: RegMap Loc
assignment of temps to locations
- ra_delta :: Int
current stack delta
- ra_stack :: StackMap
free stack slots for spilling
- ra_us :: UniqSupply
unique supply for generating names for join point fixup blocks.
- ra_spills :: [SpillReason]
Record why things were spilled, for -ddrop-asm-stats. Just keep a list here instead of a map of regs -> reasons. We don't want to slow down the allocator if we're not going to emit the stats.
- ra_DynFlags :: DynFlags
- ra_fixups :: [(BlockId, BlockId, BlockId)]
(from,fixup,to) : We inserted fixup code between from and to