[LLVMdev] possible thumb bug in constant islands

reed kotler
Mon, 18 Nov 2013 23:49:51 -0000

I don't know ARM hardly at all but...

This comment does not seem to match the code.
Or maybe tBfar is a BL?

Also, how does this work if the destination is greater than 2**21?

/// fixupUnconditionalBr - Fix up an unconditional branch whose
destination is
/// too far away to fit in its displacement field. If the LR register
has been
/// spilled in the epilogue, then we can use BL to implement a far jump.
/// Otherwise, add an intermediate branch instruction to a branch.
bool
ARMConstantIslands::fixupUnconditionalBr(ImmBranch &Br) {
   MachineInstr *MI = Br.MI;
   MachineBasicBlock *MBB = MI->getParent();
   if (!isThumb1)
     llvm_unreachable("fixupUnconditionalBr is Thumb1 only!");

   // Use BL to implement far jump.
   Br.MaxDisp = (1 << 21) * 2;
   MI->setDesc(TII->get(ARM::tBfar));
   BBInfo[MBB->getNumber()].Size += 2;
   adjustBBOffsetsAfter(MBB);
   HasFarJump = true;
   ++NumUBrFixed;

   DEBUG(dbgs() << "  Changed B to long jump " << *MI);

   return true;
}