[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
- Previous message: [llvm-dev] TableGen support for Intrinsics with multiple outputs
- Next message: [llvm-dev] Any sub-project in llvm to help with
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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>
- Previous message: [llvm-dev] TableGen support for Intrinsics with multiple outputs
- Next message: [llvm-dev] Any sub-project in llvm to help with
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]