class CriticalAntiDepBreaker
Declaration
class CriticalAntiDepBreaker : public AntiDepBreaker { /* full declaration omitted */ };
Description
This class works in conjunction with the post-RA scheduler to rename registers to break register anti-dependencies (WAR hazards).
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:36
Inherits from: AntiDepBreaker
Member Variables
- private llvm::MachineFunction& MF
- private llvm::MachineRegisterInfo& MRI
- private const llvm::TargetInstrInfo* TII
- private const llvm::TargetRegisterInfo* TRI
- private const llvm::RegisterClassInfo& RegClassInfo
- private const llvm::BitVector AllocatableSet
- The set of allocatable registers. We'll be ignoring anti-dependencies on non-allocatable registers, because they may not be safe to break.
- private std::vector<const TargetRegisterClass*> Classes
- For live regs that are only used in one register class in a live range, the register class. If the register is not live, the corresponding value is null. If the register is live but used in multiple register classes, the corresponding value is -1 casted to a pointer.
- private std::multimap<unsigned int, MachineOperand*> RegRefs
- Map registers to all their references within a live range.
- private std::vector<unsigned int> KillIndices
- The index of the most recent kill (proceeding bottom-up), or ~0u if the register is not live.
- private std::vector<unsigned int> DefIndices
- The index of the most recent complete def (proceeding bottom up), or ~0u if the register is live.
- private llvm::BitVector KeepRegs
- A set of registers which are live and cannot be changed to break anti-dependencies.
Method Overview
- public unsigned int BreakAntiDependencies(const std::vector<SUnit> & SUnits, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, unsigned int InsertPosIndex, llvm::AntiDepBreaker::DbgValueVector & DbgValues)
- public CriticalAntiDepBreaker(llvm::MachineFunction & MFi, const llvm::RegisterClassInfo & RCI)
- public void FinishBlock()
- public void Observe(llvm::MachineInstr & MI, unsigned int Count, unsigned int InsertPosIndex)
- private void PrescanInstruction(llvm::MachineInstr & MI)
- private void ScanInstruction(llvm::MachineInstr & MI, unsigned int Count)
- public void StartBlock(llvm::MachineBasicBlock * BB)
- private unsigned int findSuitableFreeRegister(llvm::CriticalAntiDepBreaker::RegRefIter RegRefBegin, llvm::CriticalAntiDepBreaker::RegRefIter RegRefEnd, unsigned int AntiDepReg, unsigned int LastNewReg, const llvm::TargetRegisterClass * RC, SmallVectorImpl<unsigned int> & Forbid)
- private bool isNewRegClobberedByRefs(llvm::CriticalAntiDepBreaker::RegRefIter RegRefBegin, llvm::CriticalAntiDepBreaker::RegRefIter RegRefEnd, unsigned int NewReg)
- public ~CriticalAntiDepBreaker()
Inherited from AntiDepBreaker:
- public BreakAntiDependencies
- public FinishBlock
- public Observe
- public StartBlock
- public UpdateDbgValue
- public UpdateDbgValues
Methods
¶unsigned int BreakAntiDependencies(
const std::vector<SUnit>& SUnits,
MachineBasicBlock::iterator Begin,
MachineBasicBlock::iterator End,
unsigned int InsertPosIndex,
llvm::AntiDepBreaker::DbgValueVector&
DbgValues)
unsigned int BreakAntiDependencies(
const std::vector<SUnit>& SUnits,
MachineBasicBlock::iterator Begin,
MachineBasicBlock::iterator End,
unsigned int InsertPosIndex,
llvm::AntiDepBreaker::DbgValueVector&
DbgValues)
Description
Identifiy anti-dependencies along the critical path of the ScheduleDAG and break them by renaming registers.
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:82
Parameters
- const std::vector<SUnit>& SUnits
- MachineBasicBlock::iterator Begin
- MachineBasicBlock::iterator End
- unsigned int InsertPosIndex
- llvm::AntiDepBreaker::DbgValueVector& DbgValues
¶CriticalAntiDepBreaker(
llvm::MachineFunction& MFi,
const llvm::RegisterClassInfo& RCI)
CriticalAntiDepBreaker(
llvm::MachineFunction& MFi,
const llvm::RegisterClassInfo& RCI)
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:74
Parameters
- llvm::MachineFunction& MFi
- const llvm::RegisterClassInfo& RCI
¶void FinishBlock()
void FinishBlock()
Description
Finish anti-dep breaking for a basic block.
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:94
¶void Observe(llvm::MachineInstr& MI,
unsigned int Count,
unsigned int InsertPosIndex)
void Observe(llvm::MachineInstr& MI,
unsigned int Count,
unsigned int InsertPosIndex)
Description
Update liveness information to account for the current instruction, which will not be scheduled.
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:90
Parameters
- llvm::MachineInstr& MI
- unsigned int Count
- unsigned int InsertPosIndex
¶void PrescanInstruction(llvm::MachineInstr& MI)
void PrescanInstruction(llvm::MachineInstr& MI)
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:97
Parameters
¶void ScanInstruction(llvm::MachineInstr& MI,
unsigned int Count)
void ScanInstruction(llvm::MachineInstr& MI,
unsigned int Count)
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:98
Parameters
- llvm::MachineInstr& MI
- unsigned int Count
¶void StartBlock(llvm::MachineBasicBlock* BB)
void StartBlock(llvm::MachineBasicBlock* BB)
Description
Initialize anti-dep breaking for a new basic block.
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:78
Parameters
¶unsigned int findSuitableFreeRegister(
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefBegin,
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefEnd,
unsigned int AntiDepReg,
unsigned int LastNewReg,
const llvm::TargetRegisterClass* RC,
SmallVectorImpl<unsigned int>& Forbid)
unsigned int findSuitableFreeRegister(
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefBegin,
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefEnd,
unsigned int AntiDepReg,
unsigned int LastNewReg,
const llvm::TargetRegisterClass* RC,
SmallVectorImpl<unsigned int>& Forbid)
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:102
Parameters
- llvm::CriticalAntiDepBreaker::RegRefIter RegRefBegin
- llvm::CriticalAntiDepBreaker::RegRefIter RegRefEnd
- unsigned int AntiDepReg
- unsigned int LastNewReg
- const llvm::TargetRegisterClass* RC
- SmallVectorImpl<unsigned int>& Forbid
¶bool isNewRegClobberedByRefs(
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefBegin,
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefEnd,
unsigned int NewReg)
bool isNewRegClobberedByRefs(
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefBegin,
llvm::CriticalAntiDepBreaker::RegRefIter
RegRefEnd,
unsigned int NewReg)
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:99
Parameters
- llvm::CriticalAntiDepBreaker::RegRefIter RegRefBegin
- llvm::CriticalAntiDepBreaker::RegRefIter RegRefEnd
- unsigned int NewReg
¶~CriticalAntiDepBreaker()
~CriticalAntiDepBreaker()
Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:75