Need Help to find bug in DelaySlot filler pass

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


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;

// 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() || I->isInlineAsm())

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

return I;
return MBB.end();