[LLVMdev] possible thumb bug in constant islands
reed kotler
rkotler at mips.com
Mon Nov 18 15:49:51 PST 2013
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;
}
More information about the llvm-dev
mailing list