vivek pandya via llvm-dev
2017-Apr-28 10:19 UTC
[llvm-dev] 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 .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<XXXSubtarget>(); 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>