|
|
|
|
Synopsis |
|
|
|
Documentation |
|
type RegSet = UniqSet Reg |
|
type RegMap a = UniqFM a |
|
emptyRegMap :: UniqFM a |
|
type BlockMap a = UniqFM a |
|
emptyBlockMap :: UniqFM a |
|
type LiveCmmTop = GenCmmTop CmmStatic LiveInfo (ListGraph (GenBasicBlock LiveInstr)) |
A top level thing which carries liveness information.
|
|
data LiveInstr |
An instruction with liveness information.
| Constructors | | Instances | |
|
|
data Liveness |
Liveness information.
The regs which die are ones which are no longer live in the *next* instruction
in this sequence.
(NB. if the instruction is a jump, these registers might still be live
at the jump target(s) - you have to check the liveness at the destination
block to find out).
| Constructors | Liveness | registers that died because they were clobbered by something.
| liveBorn :: RegSet | registers born in this instruction (written to for first time).
| liveDieRead :: RegSet | registers that died because they were read for the last time.
| liveDieWrite :: RegSet | |
|
|
|
|
data LiveInfo |
Stash regs live on entry to each basic block in the info part of the cmm code.
| Constructors | | Instances | |
|
|
type LiveBasicBlock = GenBasicBlock LiveInstr |
A basic block with liveness information.
|
|
mapBlockTop :: (LiveBasicBlock -> LiveBasicBlock) -> LiveCmmTop -> LiveCmmTop |
map a function across all the basic blocks in this code
|
|
mapBlockTopM :: Monad m => (LiveBasicBlock -> m LiveBasicBlock) -> LiveCmmTop -> m LiveCmmTop |
map a function across all the basic blocks in this code (monadic version)
|
|
mapGenBlockTop :: (GenBasicBlock i -> GenBasicBlock i) -> GenCmmTop d h (ListGraph i) -> GenCmmTop d h (ListGraph i) |
|
mapGenBlockTopM :: Monad m => (GenBasicBlock i -> m (GenBasicBlock i)) -> GenCmmTop d h (ListGraph i) -> m (GenCmmTop d h (ListGraph i)) |
map a function across all the basic blocks in this code (monadic version)
|
|
stripLive :: LiveCmmTop -> NatCmmTop |
Strip away liveness information, yielding NatCmmTop
|
|
spillNatBlock :: NatBasicBlock -> NatBasicBlock |
Make real spill instructions out of SPILL, RELOAD pseudos
|
|
slurpConflicts :: LiveCmmTop -> (Bag (UniqSet Reg), Bag (Reg, Reg)) |
Slurp out the list of register conflicts and reg-reg moves from this top level thing.
Slurping of conflicts and moves is wrapped up together so we don't have
to make two passes over the same code when we want to build the graph.
|
|
slurpReloadCoalesce :: LiveCmmTop -> Bag (Reg, Reg) |
For spill/reloads
SPILL v1, slot1
...
RELOAD slot1, v2
If we can arrange that v1 and v2 are allocated to the same hreg it's more likely
the spill/reload instrs can be cleaned and replaced by a nop reg-reg move.
|
|
eraseDeltasLive :: LiveCmmTop -> LiveCmmTop |
Erase Delta instructions.
|
|
patchEraseLive :: (Reg -> Reg) -> LiveCmmTop -> LiveCmmTop |
Patch the registers in this code according to this register mapping.
also erase reg -> reg moves when the reg is the same.
also erase reg -> reg moves when the destination dies in this instr.
|
|
patchRegsLiveInstr :: (Reg -> Reg) -> LiveInstr -> LiveInstr |
Patch registers in this LiveInstr, including the liveness information.
|
|
regLiveness :: NatCmmTop -> UniqSM LiveCmmTop |
|
Produced by Haddock version 2.3.0 |