<div dir="ltr"><div>Hello LLVM Devs,</div><div><br></div><div>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.</div><div><br></div><div>For indirect branch with dealy slots for following case :</div><div>addk<span class="gmail-Apple-tab-span" style="white-space:pre">      </span>r29,r3,r0</div><div>br<span class="gmail-Apple-tab-span" style="white-space:pre">    </span>r27</div><div>.LBB0_9:    </div><div><br></div><div>it generates follwoing:</div><div>brd<span class="gmail-Apple-tab-span" style="white-space:pre">     </span>r27</div><div>addk<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>r29,r3,r0</div><div># BB#9:   </div><div><br></div><div>so after investigating it I found that it returns true from </div><div><br></div><div>bool AsmPrinter::</div><div>isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) </div><div><br></div><div>because of no terminators in predecessor basic block</div><div>and so it does not print label in void AsmPrinter::EmitBasicBlockStart.</div><div> </div><div>here is relevant code for my delay slot filler pass which is very similar to </div><div>Sparc PC's delay slot filler pass.</div><div><br></div><div>bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {</div><div>  bool Changed = false;</div><div>  Subtarget = &MBB.getParent()->getSubtarget<XXXSubtarget>();</div><div>  const TargetInstrInfo *TII = Subtarget->getInstrInfo();</div><div><br></div><div>  for (MachineBasicBlock::iterator I = MBB.begin(); I != MBB.end(); ) {</div><div>    MachineBasicBlock::iterator MI = I;</div><div>    ++I;    </div><div><br></div><div>    // If MI has no delay slot, skip.</div><div>    if (!MI->hasDelaySlot())</div><div>      continue;</div><div><br></div><div>    MachineBasicBlock::iterator D = MBB.end();</div><div><br></div><div>    if (!DisableDelaySlotFiller)</div><div>      D = findDelayInstr(MBB, MI);</div><div><br></div><div>    ++FilledSlots;</div><div>    Changed = true;</div><div><br></div><div>    if (D == MBB.end()) {</div><div>      BuildMI(MBB, I, MI->getDebugLoc(), TII->get(XXX::NOP));</div><div>    } else {</div><div>      MBB.splice(I, &MBB, D);</div><div>    }</div><div><br></div><div>    MIBundleBuilder(MBB, MI, --I);</div><div>  }</div><div>  return Changed;</div><div>}</div><div><br></div><div>MachineBasicBlock::iterator</div><div>Filler::findDelayInstr(MachineBasicBlock &MBB,</div><div>                       MachineBasicBlock::iterator slot)</div><div>{</div><div>  SmallSet<unsigned, 32> RegDefs;</div><div>  SmallSet<unsigned, 32> RegUses;</div><div>  bool sawLoad = false;</div><div>  bool sawStore = false;</div><div><br></div><div>  if (slot == MBB.begin())</div><div>    return MBB.end();</div><div><br></div><div>    insertDefsUses(slot, RegDefs, RegUses);</div><div><br></div><div>  bool done = false;</div><div><br></div><div>  MachineBasicBlock::iterator I = slot;</div><div><br></div><div>  while (!done) {</div><div>    done = (I == MBB.begin());</div><div><br></div><div>    if (!done)</div><div>      --I;</div><div><br></div><div>    // skip debug value</div><div>    if (I->isDebugValue())</div><div>      continue;</div><div><br></div><div>    if (I->hasUnmodeledSideEffects() || I->hasDelaySlot() || isDelayFiller(MBB, I) || hasImmInstruction(I) ||  I->isBranch()</div><div>        || I->isCall() || I->isReturn() || I->isBarrier() || I->isInlineAsm())</div><div>      break;</div><div><br></div><div>    if (delayHasHazard(I, sawLoad, sawStore, RegDefs, RegUses)) {</div><div>      insertDefsUses(I, RegDefs, RegUses);</div><div>      continue;</div><div>    }</div><div><br></div><div>    return I;</div><div>  }</div><div>  return MBB.end();</div><div>}</div><div><br></div><div>Sincerely,</div><div>Vivek</div><div><br></div></div>