Deleted Added
full compact
568a569,617
> // Resolve TCReturn pseudo-instruction
> void ARMFrameLowering::fixTCReturn(MachineFunction &MF,
> MachineBasicBlock &MBB) const {
> MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
> assert(MBBI->isReturn() && "Can only insert epilog into returning blocks");
> unsigned RetOpcode = MBBI->getOpcode();
> DebugLoc dl = MBBI->getDebugLoc();
> const ARMBaseInstrInfo &TII =
> *MF.getTarget().getSubtarget<ARMSubtarget>().getInstrInfo();
>
> if (!(RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNri))
> return;
>
> // Tail call return: adjust the stack pointer and jump to callee.
> MBBI = MBB.getLastNonDebugInstr();
> MachineOperand &JumpTarget = MBBI->getOperand(0);
>
> // Jump to label or value in register.
> if (RetOpcode == ARM::TCRETURNdi) {
> unsigned TCOpcode = STI.isThumb() ?
> (STI.isTargetMachO() ? ARM::tTAILJMPd : ARM::tTAILJMPdND) :
> ARM::TAILJMPd;
> MachineInstrBuilder MIB = BuildMI(MBB, MBBI, dl, TII.get(TCOpcode));
> if (JumpTarget.isGlobal())
> MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
> JumpTarget.getTargetFlags());
> else {
> assert(JumpTarget.isSymbol());
> MIB.addExternalSymbol(JumpTarget.getSymbolName(),
> JumpTarget.getTargetFlags());
> }
>
> // Add the default predicate in Thumb mode.
> if (STI.isThumb()) MIB.addImm(ARMCC::AL).addReg(0);
> } else if (RetOpcode == ARM::TCRETURNri) {
> BuildMI(MBB, MBBI, dl,
> TII.get(STI.isThumb() ? ARM::tTAILJMPr : ARM::TAILJMPr)).
> addReg(JumpTarget.getReg(), RegState::Kill);
> }
>
> MachineInstr *NewMI = std::prev(MBBI);
> for (unsigned i = 1, e = MBBI->getNumOperands(); i != e; ++i)
> NewMI->addOperand(MBBI->getOperand(i));
>
> // Delete the pseudo instruction TCRETURN.
> MBB.erase(MBBI);
> MBBI = NewMI;
> }
>
573d621
< unsigned RetOpcode = MBBI->getOpcode();
591c639,640
< if (MF.getFunction()->getCallingConv() == CallingConv::GHC)
---
> if (MF.getFunction()->getCallingConv() == CallingConv::GHC) {
> fixTCReturn(MF, MBB);
592a642
> }
664,667c714
< if (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNri) {
< // Tail call return: adjust the stack pointer and jump to callee.
< MBBI = MBB.getLastNonDebugInstr();
< MachineOperand &JumpTarget = MBBI->getOperand(0);
---
> fixTCReturn(MF, MBB);
669,700d715
< // Jump to label or value in register.
< if (RetOpcode == ARM::TCRETURNdi) {
< unsigned TCOpcode = STI.isThumb() ?
< (STI.isTargetMachO() ? ARM::tTAILJMPd : ARM::tTAILJMPdND) :
< ARM::TAILJMPd;
< MachineInstrBuilder MIB = BuildMI(MBB, MBBI, dl, TII.get(TCOpcode));
< if (JumpTarget.isGlobal())
< MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(),
< JumpTarget.getTargetFlags());
< else {
< assert(JumpTarget.isSymbol());
< MIB.addExternalSymbol(JumpTarget.getSymbolName(),
< JumpTarget.getTargetFlags());
< }
<
< // Add the default predicate in Thumb mode.
< if (STI.isThumb()) MIB.addImm(ARMCC::AL).addReg(0);
< } else if (RetOpcode == ARM::TCRETURNri) {
< BuildMI(MBB, MBBI, dl,
< TII.get(STI.isThumb() ? ARM::tTAILJMPr : ARM::TAILJMPr)).
< addReg(JumpTarget.getReg(), RegState::Kill);
< }
<
< MachineInstr *NewMI = std::prev(MBBI);
< for (unsigned i = 1, e = MBBI->getNumOperands(); i != e; ++i)
< NewMI->addOperand(MBBI->getOperand(i));
<
< // Delete the pseudo instruction TCRETURN.
< MBB.erase(MBBI);
< MBBI = NewMI;
< }
<