[LLVMdev] possible thumb bug in constant islands

Reed Kotler
Tue, 19 Nov 2013 00:17:12 -0000

Also, how do you know that the LR register has been spilled in the prologue?

Is this always the case with thumb even for a leaf function?

It's of course a reasonable assumption to make that such a large
function would call something but maybe everything has been inlined.

On 11/18/2013 03:49 PM, reed kotler wrote:
> 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;
> }