ghc-9.4.0.20220623: The GHC API
Safe HaskellSafe-Inferred
LanguageHaskell2010

GHC.CmmToAsm.Reg.Linear.Base

Description

Put common type definitions here to break recursive module dependencies.

Synopsis

Documentation

data BlockAssignment freeRegs 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.

lookupBlockAssignment :: BlockId -> BlockAssignment freeRegs -> Maybe (freeRegs, RegMap Loc) Source #

Find the register mapping for a specific BlockId.

lookupFirstUsed :: VirtualReg -> BlockAssignment freeRegs -> Maybe RealReg Source #

Lookup which register a virtual register was first assigned to.

updateBlockAssignment :: BlockId -> (freeRegs, RegMap Loc) -> BlockAssignment freeRegs -> BlockAssignment freeRegs Source #

Add new register mappings for a specific block.

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.

Constructors

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

Instances

Instances details
Show Loc Source # 
Instance details

Defined in GHC.CmmToAsm.Reg.Linear.Base

Outputable Loc Source # 
Instance details

Defined in GHC.CmmToAsm.Reg.Linear.Base

Methods

ppr :: Loc -> SDoc Source #

Eq Loc Source # 
Instance details

Defined in GHC.CmmToAsm.Reg.Linear.Base

Methods

(==) :: Loc -> Loc -> Bool #

(/=) :: Loc -> Loc -> Bool #

Ord Loc Source # 
Instance details

Defined in GHC.CmmToAsm.Reg.Linear.Base

Methods

compare :: Loc -> Loc -> Ordering #

(<) :: Loc -> Loc -> Bool #

(<=) :: Loc -> Loc -> Bool #

(>) :: Loc -> Loc -> Bool #

(>=) :: Loc -> Loc -> Bool #

max :: Loc -> Loc -> Loc #

min :: Loc -> Loc -> Loc #

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.

Constructors

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.

Constructors

RegAllocStats 

Fields

data RA_State freeRegs Source #

The register allocator state

Constructors

RA_State 

Fields