[llvm-dev] Need Help to find bug in DelaySlot filler pass (original) (raw)

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 .LBB0_9:

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 to Sparc PC's delay slot filler pass.

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

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

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

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

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

++FilledSlots;
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; }

MachineBasicBlock::iterator 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)
  --I;

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

if (I->hasUnmodeledSideEffects() || I->hasDelaySlot() ||

isDelayFiller(MBB, I) || hasImmInstruction(I) || I->isBranch() || I->isCall() || I->isReturn() || I->isBarrier() || I->isInlineAsm()) break;

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

return I;

} return MBB.end(); }

Sincerely, Vivek -------------- 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