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:

Methods

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)

Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:74

Parameters

llvm::MachineFunction& MFi
const llvm::RegisterClassInfo& RCI

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)

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)

Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:97

Parameters

llvm::MachineInstr& MI

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)

Description

Initialize anti-dep breaking for a new basic block.

Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:78

Parameters

llvm::MachineBasicBlock* BB

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)

Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:99

Parameters

llvm::CriticalAntiDepBreaker::RegRefIter RegRefBegin
llvm::CriticalAntiDepBreaker::RegRefIter RegRefEnd
unsigned int NewReg

~CriticalAntiDepBreaker()

Declared at: llvm/lib/CodeGen/CriticalAntiDepBreaker.h:75