diff options
| -rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 19 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrInfo.td | 71 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMInstrThumb.td | 12 | 
3 files changed, 27 insertions, 75 deletions
diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index bd4b2a9da98..402ecb0c5ff 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -422,17 +422,16 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,      if (AFI->getGPRCalleeSavedArea1Size()) MBBI++;    } -  if (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNdiND || -      RetOpcode == ARM::TCRETURNri || RetOpcode == ARM::TCRETURNriND) { +  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);      // Jump to label or value in register. -    if (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNdiND) { -      unsigned TCOpcode = (RetOpcode == ARM::TCRETURNdi) -        ? (STI.isThumb() ? ARM::tTAILJMPd : ARM::TAILJMPd) -        : (STI.isThumb() ? ARM::tTAILJMPdND : ARM::TAILJMPdND); +    if (RetOpcode == ARM::TCRETURNdi) { +      unsigned TCOpcode = STI.isThumb() ? +               (STI.isTargetIOS() ? ARM::tTAILJMPd : ARM::tTAILJMPdND) : +               ARM::TAILJMPd;        MachineInstrBuilder MIB = BuildMI(MBB, MBBI, dl, TII.get(TCOpcode));        if (JumpTarget.isGlobal())          MIB.addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), @@ -449,10 +448,6 @@ void ARMFrameLowering::emitEpilogue(MachineFunction &MF,        BuildMI(MBB, MBBI, dl,                TII.get(STI.isThumb() ? ARM::tTAILJMPr : ARM::TAILJMPr)).          addReg(JumpTarget.getReg(), RegState::Kill); -    } else if (RetOpcode == ARM::TCRETURNriND) { -      BuildMI(MBB, MBBI, dl, -              TII.get(STI.isThumb() ? ARM::tTAILJMPrND : ARM::TAILJMPrND)). -        addReg(JumpTarget.getReg(), RegState::Kill);      }      MachineInstr *NewMI = prior(MBBI); @@ -648,9 +643,7 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,    DebugLoc DL = MI->getDebugLoc();    unsigned RetOpcode = MI->getOpcode();    bool isTailCall = (RetOpcode == ARM::TCRETURNdi || -                     RetOpcode == ARM::TCRETURNdiND || -                     RetOpcode == ARM::TCRETURNri || -                     RetOpcode == ARM::TCRETURNriND); +                     RetOpcode == ARM::TCRETURNri);    SmallVector<unsigned, 4> Regs;    unsigned i = CSI.size(); diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td index e7716935906..d453b2c20b1 100644 --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -2026,45 +2026,22 @@ def BXJ : ABI<0b0001, (outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",  // Tail calls. -let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in { -  // IOS versions. -  let Uses = [SP] in { -    def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops), -                       IIC_Br, []>, Requires<[IsIOS]>; +let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1, Uses = [SP] in { +  def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops), +                              IIC_Br, []>; -    def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), -                       IIC_Br, []>, Requires<[IsIOS]>; +  def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), +                              IIC_Br, []>; -    def TAILJMPd : ARMPseudoExpand<(outs), (ins br_target:$dst, variable_ops), -                   4, IIC_Br, [], -                   (Bcc br_target:$dst, (ops 14, zero_reg))>, -                   Requires<[IsARM, IsIOS]>; +  def TAILJMPd : ARMPseudoExpand<(outs), (ins br_target:$dst, variable_ops), +                                 4, IIC_Br, [], +                                 (Bcc br_target:$dst, (ops 14, zero_reg))>, +                                 Requires<[IsARM]>; -    def TAILJMPr : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), -                   4, IIC_Br, [], -                   (BX GPR:$dst)>, -                   Requires<[IsARM, IsIOS]>; - -  } - -  // Non-IOS versions (the difference is R9). -  let Uses = [SP] in { -    def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops), -                       IIC_Br, []>, Requires<[IsNotIOS]>; - -    def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops), -                       IIC_Br, []>, Requires<[IsNotIOS]>; - -    def TAILJMPdND : ARMPseudoExpand<(outs), (ins brtarget:$dst, variable_ops), -                   4, IIC_Br, [], -                   (Bcc br_target:$dst, (ops 14, zero_reg))>, -                   Requires<[IsARM, IsNotIOS]>; - -    def TAILJMPrND : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), -                     4, IIC_Br, [], -                     (BX GPR:$dst)>, -                     Requires<[IsARM, IsNotIOS]>; -  } +  def TAILJMPr : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), +                                 4, IIC_Br, [], +                                 (BX GPR:$dst)>, +                                 Requires<[IsARM]>;  }  // Secure Monitor Call is a system instruction. @@ -4829,24 +4806,10 @@ def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),  // TODO: add,sub,and, 3-instr forms? -// Tail calls -def : ARMPat<(ARMtcret tcGPR:$dst), -          (TCRETURNri tcGPR:$dst)>, Requires<[IsIOS]>; - -def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)), -          (TCRETURNdi texternalsym:$dst)>, Requires<[IsIOS]>; - -def : ARMPat<(ARMtcret (i32 texternalsym:$dst)), -          (TCRETURNdi texternalsym:$dst)>, Requires<[IsIOS]>; - -def : ARMPat<(ARMtcret tcGPR:$dst), -          (TCRETURNriND tcGPR:$dst)>, Requires<[IsNotIOS]>; - -def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)), -          (TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotIOS]>; - -def : ARMPat<(ARMtcret (i32 texternalsym:$dst)), -          (TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotIOS]>; +// Tail calls. These patterns also apply to Thumb mode. +def : Pat<(ARMtcret tcGPR:$dst), (TCRETURNri tcGPR:$dst)>; +def : Pat<(ARMtcret (i32 tglobaladdr:$dst)), (TCRETURNdi texternalsym:$dst)>; +def : Pat<(ARMtcret (i32 texternalsym:$dst)), (TCRETURNdi texternalsym:$dst)>;  // Direct calls  def : ARMPat<(ARMcall texternalsym:$func), (BL texternalsym:$func)>, diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td index 6c45ccc5aeb..b9ef6925b51 100644 --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -504,24 +504,20 @@ let isBranch = 1, isTerminator = 1 in  let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {    // IOS versions.    let Uses = [SP] in { -    // tTAILJMPd: IOS version uses a Thumb2 branch (no Thumb1 tail calls -    // on IOS), so it's in ARMInstrThumb2.td.      def tTAILJMPr : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),                       4, IIC_Br, [],                       (tBX GPR:$dst, (ops 14, zero_reg))>, -                     Requires<[IsThumb, IsIOS]>; +                     Requires<[IsThumb]>;    } -  // Non-IOS versions (the difference is R9). +  // tTAILJMPd: IOS version uses a Thumb2 branch (no Thumb1 tail calls +  // on IOS), so it's in ARMInstrThumb2.td. +  // Non-IOS version:    let Uses = [SP] in {      def tTAILJMPdND : tPseudoExpand<(outs),                     (ins t_brtarget:$dst, pred:$p, variable_ops),                     4, IIC_Br, [],                     (tB t_brtarget:$dst, pred:$p)>,                   Requires<[IsThumb, IsNotIOS]>; -    def tTAILJMPrND : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops), -                     4, IIC_Br, [], -                     (tBX GPR:$dst, (ops 14, zero_reg))>, -                     Requires<[IsThumb, IsNotIOS]>;    }  }  | 

