[llvm-dev] Need Help to find bug in DelaySlot filler pass

vivek pandya via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 28 03:19:10 PDT 2017

Hello LLVM Devs,

I have implemented delay slot filler pass for an architecture but I am
getting problem in BasisBlock start label emission. Please provide some
hints to solve this bug.

For indirect branch with dealy slots for following case :
addk r29,r3,r0
br r27

it generates follwoing:
brd r27
addk r29,r3,r0
# BB#9:

so after investigating it I found that it returns true from

bool AsmPrinter::
isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB)

because of no terminators in predecessor basic block
and so it does not print label in void AsmPrinter::EmitBasicBlockStart.

here is relevant code for my delay slot filler pass which is very similar
Sparc PC's delay slot filler pass.

bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
  bool Changed = false;
  Subtarget = &MBB.getParent()->getSubtarget<XXXSubtarget>();
  const TargetInstrInfo *TII = Subtarget->getInstrInfo();

  for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ) {
    MachineBasicBlock::iterator MI = I;

    // If MI has no delay slot, skip.
    if (!MI->hasDelaySlot())

    MachineBasicBlock::iterator D = MBB.end();

    if (!DisableDelaySlotFiller)
      D = findDelayInstr(MBB, MI);

    Changed = true;

    if (D == MBB.end()) {
      BuildMI(MBB, I, MI->getDebugLoc(), TII->get(XXX::NOP));
    } else {
      MBB.splice(I, &MBB, D);

    MIBundleBuilder(MBB, MI, --I);
  return Changed;

Filler::findDelayInstr(MachineBasicBlock &MBB,
                       MachineBasicBlock::iterator slot)
  SmallSet<unsigned, 32> RegDefs;
  SmallSet<unsigned, 32> RegUses;
  bool sawLoad = false;
  bool sawStore = false;

  if (slot == MBB.begin())
    return MBB.end();

    insertDefsUses(slot, RegDefs, RegUses);

  bool done = false;

  MachineBasicBlock::iterator I = slot;

  while (!done) {
    done = (I == MBB.begin());

    if (!done)

    // skip debug value
    if (I->isDebugValue())

    if (I->hasUnmodeledSideEffects() || I->hasDelaySlot() ||
isDelayFiller(MBB, I) || hasImmInstruction(I) ||  I->isBranch()
        || I->isCall() || I->isReturn() || I->isBarrier() ||

    if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) {
      insertDefsUses(I, RegDefs, RegUses);

    return I;
  return MBB.end();

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170428/fa553d18/attachment.html>

More information about the llvm-dev mailing list