RegAlloc.Linear.State

ghc-8.6.3: The GHC API

Safe Haskell | None
Language | Haskell2010

RegAlloc.Linear.State

Description

State monad for the linear register allocator.

Synopsis

- 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
  }
- data RegM freeRegs a
- runR :: DynFlags -> BlockAssignment freeRegs -> freeRegs -> RegMap Loc -> StackMap -> UniqSupply -> RegM freeRegs a -> (BlockAssignment freeRegs, StackMap, RegAllocStats, a)
- spillR :: Instruction instr => Reg -> Unique -> RegM freeRegs (instr, Int)
- loadR :: Instruction instr => Reg -> Int -> RegM freeRegs instr
- getFreeRegsR :: RegM freeRegs freeRegs
- setFreeRegsR :: freeRegs -> RegM freeRegs ()
- getAssigR :: RegM freeRegs (RegMap Loc)
- setAssigR :: RegMap Loc -> RegM freeRegs ()
- getBlockAssigR :: RegM freeRegs (BlockAssignment freeRegs)
- setBlockAssigR :: BlockAssignment freeRegs -> RegM freeRegs ()
- setDeltaR :: Int -> RegM freeRegs ()
- getDeltaR :: RegM freeRegs Int
- getUniqueR :: RegM freeRegs Unique
- recordSpill :: SpillReason -> RegM freeRegs ()

# Documentation

data RA_State freeRegs #

The register allocator state

Constructors

RA_State |
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

data RegM freeRegs a #

The register allocator monad type.

Instances

Monad (RegM freeRegs) # |
Instance details Defined in RegAlloc.Linear.State Methods (>>=) :: RegM freeRegs a -> (a -> RegM freeRegs b) -> RegM freeRegs b Source # (>>) :: RegM freeRegs a -> RegM freeRegs b -> RegM freeRegs b Source # return :: a -> RegM freeRegs a Source # fail :: String -> RegM freeRegs a Source #
Functor (RegM freeRegs) # |
Instance details Defined in RegAlloc.Linear.State Methods fmap :: (a -> b) -> RegM freeRegs a -> RegM freeRegs b Source # (<$) :: a -> RegM freeRegs b -> RegM freeRegs a Source #
Applicative (RegM freeRegs) # |
Instance details Defined in RegAlloc.Linear.State Methods pure :: a -> RegM freeRegs a Source # (<*>) :: RegM freeRegs (a -> b) -> RegM freeRegs a -> RegM freeRegs b Source # liftA2 :: (a -> b -> c) -> RegM freeRegs a -> RegM freeRegs b -> RegM freeRegs c Source # (*>) :: RegM freeRegs a -> RegM freeRegs b -> RegM freeRegs b Source # (<*) :: RegM freeRegs a -> RegM freeRegs b -> RegM freeRegs a Source #
HasDynFlags (RegM a) # |
Instance details Defined in RegAlloc.Linear.State Methods getDynFlags :: RegM a DynFlags #

runR :: DynFlags -> BlockAssignment freeRegs -> freeRegs -> RegMap Loc -> StackMap -> UniqSupply -> RegM freeRegs a -> (BlockAssignment freeRegs, StackMap, RegAllocStats, a) #

Run a computation in the RegM register allocator monad.

spillR :: Instruction instr => Reg -> Unique -> RegM freeRegs (instr, Int) #

loadR :: Instruction instr => Reg -> Int -> RegM freeRegs instr #

getFreeRegsR :: RegM freeRegs freeRegs #

setFreeRegsR :: freeRegs -> RegM freeRegs () #

getAssigR :: RegM freeRegs (RegMap Loc) #

setAssigR :: RegMap Loc -> RegM freeRegs () #

getBlockAssigR :: RegM freeRegs (BlockAssignment freeRegs) #

setBlockAssigR :: BlockAssignment freeRegs -> RegM freeRegs () #

setDeltaR :: Int -> RegM freeRegs () #

getDeltaR :: RegM freeRegs Int #

getUniqueR :: RegM freeRegs Unique #

recordSpill :: SpillReason -> RegM freeRegs () #

Record that a spill instruction was inserted, for profiling.