diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2010-11-30 23:55:39 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2010-11-30 23:55:39 +0000 |
| commit | d4b0873c06de66a00e28850f31c227995ecb1592 (patch) | |
| tree | 39429808ff237190ba3ba4083cded67bc2ba0496 /llvm/lib/Target/ARM/ARMFrameInfo.cpp | |
| parent | 05632cb5cc06765c692dfd45d99cedf65e6d142e (diff) | |
| download | bcm5719-llvm-d4b0873c06de66a00e28850f31c227995ecb1592.tar.gz bcm5719-llvm-d4b0873c06de66a00e28850f31c227995ecb1592.zip | |
Enable sibling call optimization of libcalls which are expanded during
legalization time. Since at legalization time there is no mapping from
SDNode back to the corresponding LLVM instruction and the return
SDNode is target specific, this requires a target hook to check for
eligibility. Only x86 and ARM support this form of sibcall optimization
right now.
rdar://8707777
llvm-svn: 120501
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFrameInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMFrameInfo.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/ARMFrameInfo.cpp b/llvm/lib/Target/ARM/ARMFrameInfo.cpp index e2531d04d05..58a7c61d90f 100644 --- a/llvm/lib/Target/ARM/ARMFrameInfo.cpp +++ b/llvm/lib/Target/ARM/ARMFrameInfo.cpp @@ -374,16 +374,19 @@ void ARMFrameInfo::emitEpilogue(MachineFunction &MF, MachineOperand &JumpTarget = MBBI->getOperand(0); // Jump to label or value in register. - if (RetOpcode == ARM::TCRETURNdi) { - BuildMI(MBB, MBBI, dl, - TII.get(STI.isThumb() ? ARM::TAILJMPdt : ARM::TAILJMPd)). - addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), - JumpTarget.getTargetFlags()); - } else if (RetOpcode == ARM::TCRETURNdiND) { - BuildMI(MBB, MBBI, dl, - TII.get(STI.isThumb() ? ARM::TAILJMPdNDt : ARM::TAILJMPdND)). - addGlobalAddress(JumpTarget.getGlobal(), JumpTarget.getOffset(), - JumpTarget.getTargetFlags()); + if (RetOpcode == ARM::TCRETURNdi || RetOpcode == ARM::TCRETURNdiND) { + unsigned TCOpcode = (RetOpcode == ARM::TCRETURNdi) + ? (STI.isThumb() ? ARM::TAILJMPdt : ARM::TAILJMPd) + : (STI.isThumb() ? ARM::TAILJMPdNDt : ARM::TAILJMPdND); + 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()); + } } else if (RetOpcode == ARM::TCRETURNri) { BuildMI(MBB, MBBI, dl, TII.get(ARM::TAILJMPr)). addReg(JumpTarget.getReg(), RegState::Kill); |

