LLVM 23.0.0git
MipsDelaySlotFiller.cpp File Reference

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "mips-delay-slot-filler"

Functions

 STATISTIC (FilledSlots, "Number of delay slots filled")
 STATISTIC (UsefulSlots, "Number of delay slots filled with instructions that" " are not NOP.")
 STATISTIC (R5900ShortLoopNops, "Number of delay slots left as NOP for R5900 " "short loop fix")
static bool hasUnoccupiedSlot (const MachineInstr *MI)
static bool isR5900ShortLoopBranch (const MachineInstr *MI, const MachineBasicBlock &MBB)
 Check if a branch is a short backward loop that triggers the R5900 erratum.
 INITIALIZE_PASS (MipsDelaySlotFiller, DEBUG_TYPE, "Fill delay slot for MIPS", false, false) static void insertDelayFiller(Iter Filler
 This function inserts clones of Filler into predecessor blocks.
 for (const auto &I :BrMap)
static void addLiveInRegs (Iter Filler, MachineBasicBlock &MBB)
 This function adds registers Filler defines to MBB's live-in register list.
static int getEquivalentCallShort (int Opcode)

Variables

static cl::opt< boolDisableDelaySlotFiller ("disable-mips-delay-filler", cl::init(false), cl::desc("Fill all delay slots with NOPs."), cl::Hidden)
static cl::opt< boolDisableForwardSearch ("disable-mips-df-forward-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search forward."), cl::Hidden)
static cl::opt< boolDisableSuccBBSearch ("disable-mips-df-succbb-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search successor basic blocks."), cl::Hidden)
static cl::opt< boolDisableBackwardSearch ("disable-mips-df-backward-search", cl::init(false), cl::desc("Disallow MIPS delay filler to search backward."), cl::Hidden)
cl::opt< CompactBranchPolicy > MipsCompactBranchPolicy
const BB2BrMap & BrMap

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "mips-delay-slot-filler"

Definition at line 50 of file MipsDelaySlotFiller.cpp.

Function Documentation

◆ addLiveInRegs()

void addLiveInRegs ( Iter Filler,
MachineBasicBlock & MBB )
static

This function adds registers Filler defines to MBB's live-in register list.

Definition at line 372 of file MipsDelaySlotFiller.cpp.

References assert(), llvm::TargetRegisterInfo::getAllocatableSet(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), MBB, and llvm::BitVector::test().

◆ for()

for ( const auto &I :BrMap )

Definition at line 361 of file MipsDelaySlotFiller.cpp.

References llvm::MIBundleBuilder::append(), BrMap, and I.

◆ getEquivalentCallShort()

int getEquivalentCallShort ( int Opcode)
static

Definition at line 629 of file MipsDelaySlotFiller.cpp.

References llvm_unreachable.

◆ hasUnoccupiedSlot()

bool hasUnoccupiedSlot ( const MachineInstr * MI)
static

Definition at line 279 of file MipsDelaySlotFiller.cpp.

References MI.

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( MipsDelaySlotFiller ,
DEBUG_TYPE ,
"Fill delay slot for MIPS" ,
false ,
false  )

This function inserts clones of Filler into predecessor blocks.

References DEBUG_TYPE.

◆ isR5900ShortLoopBranch()

bool isR5900ShortLoopBranch ( const MachineInstr * MI,
const MachineBasicBlock & MBB )
static

Check if a branch is a short backward loop that triggers the R5900 erratum.

Quote from binutils-gdb/gas/config/tc-mips.c:

On the R5900 short loops need to be fixed by inserting a NOP in the branch delay slot.

The short loop bug under certain conditions causes loops to execute only once or twice. We must ensure that the assembler never generates loops that satisfy all of the following conditions:

  • a loop consists of less than or equal to six instructions (including the branch delay slot);
  • a loop contains only one conditional branch instruction at the end of the loop;
  • a loop does not contain any other branch or jump instructions;
  • a branch delay slot of the loop is not NOP (EE 2.9 or later).

We need to do this because of a hardware bug in the R5900 chip.

Definition at line 301 of file MipsDelaySlotFiller.cpp.

References InstrCount, MBB, and MI.

◆ STATISTIC() [1/3]

STATISTIC ( FilledSlots ,
"Number of delay slots filled"  )

◆ STATISTIC() [2/3]

STATISTIC ( R5900ShortLoopNops ,
"Number of delay slots left as NOP for R5900 " "short loop fix"  )

◆ STATISTIC() [3/3]

STATISTIC ( UsefulSlots ,
"Number of delay slots filled with instructions that" " are not NOP."  )

Variable Documentation

◆ BrMap

const BB2BrMap& BrMap
Initial value:
{
MachineFunction *MF = Filler->getParent()->getParent()

Definition at line 358 of file MipsDelaySlotFiller.cpp.

Referenced by for().

◆ DisableBackwardSearch

cl::opt< bool > DisableBackwardSearch("disable-mips-df-backward-search", cl::init(false), cl::desc("Disallow MIPS delay filler to search backward."), cl::Hidden) ( "disable-mips-df-backward-search" ,
cl::init(false) ,
cl::desc("Disallow MIPS delay filler to search backward.") ,
cl::Hidden  )
static

◆ DisableDelaySlotFiller

cl::opt< bool > DisableDelaySlotFiller("disable-mips-delay-filler", cl::init(false), cl::desc("Fill all delay slots with NOPs."), cl::Hidden) ( "disable-mips-delay-filler" ,
cl::init(false) ,
cl::desc("Fill all delay slots with NOPs.") ,
cl::Hidden  )
static

◆ DisableForwardSearch

cl::opt< bool > DisableForwardSearch("disable-mips-df-forward-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search forward."), cl::Hidden) ( "disable-mips-df-forward-search" ,
cl::init(true) ,
cl::desc("Disallow MIPS delay filler to search forward.") ,
cl::Hidden  )
static

◆ DisableSuccBBSearch

cl::opt< bool > DisableSuccBBSearch("disable-mips-df-succbb-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search successor basic blocks."), cl::Hidden) ( "disable-mips-df-succbb-search" ,
cl::init(true) ,
cl::desc("Disallow MIPS delay filler to search successor basic blocks.") ,
cl::Hidden  )
static

◆ MipsCompactBranchPolicy

cl::opt<CompactBranchPolicy> MipsCompactBranchPolicy
extern