ghc-7.4.2: The GHC API

Safe HaskellNone



Put common type definitions here to break recursive module dependencies.



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.

data Loc Source

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.


InReg !RealReg

vreg is in a register

InMem !StackSlot

vreg is held in a stack slot

InBoth !RealReg !StackSlot

vreg is held in both a register and a stack slot


regsOfLoc :: Loc -> [RealReg]Source

Get the reg numbers stored in this Loc.

data SpillReason Source

Reasons why instructions might be inserted by the spiller. Used when generating stats for -ddrop-asm-stats.


SpillAlloc !Unique

vreg was spilled to a slot so we could use its current hreg for another vreg

SpillClobber !Unique

vreg was moved because its hreg was clobbered

SpillLoad !Unique

vreg was loaded from a spill slot

SpillJoinRR !Unique

reg-reg move inserted during join to targets

SpillJoinRM !Unique

reg-mem move inserted during join to targets

data RegAllocStats Source

Used to carry interesting stats out of the register allocator.



data RA_State freeRegs Source

The register alloctor state




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.

newtype RegM freeRegs a Source

The register allocator monad type.




unReg :: RA_State freeRegs -> (#RA_State freeRegs, a#)


Monad (RegM freeRegs)

The RegM Monad