diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-07-09 02:46:53 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-07-09 02:46:53 +0000 |
| commit | 4d1e9bf7171ae9e9ef8bb74a3f11d17d298063ef (patch) | |
| tree | e46952a9fec32eda6327a4063584a9442d56c53c /llvm | |
| parent | 88765d48316d0fc53fa943d6258cfb0e4fcf84e1 (diff) | |
| download | bcm5719-llvm-4d1e9bf7171ae9e9ef8bb74a3f11d17d298063ef.tar.gz bcm5719-llvm-4d1e9bf7171ae9e9ef8bb74a3f11d17d298063ef.zip | |
hoist check for IsTailCall to callers. Eliminate redundant check for
x86-64: GOT-style PIC is never used on x86-64.
llvm-svn: 75090
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index a024d102001..3889e61acf6 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1321,22 +1321,18 @@ X86TargetLowering::NameDecorationForFORMAL_ARGUMENTS(SDValue Op) { /// CallRequiresGOTInRegister - Check whether the call requires the GOT pointer /// in a register before calling. -static bool CallRequiresGOTPtrInReg(const TargetMachine &TM, - bool IsTailCall) { +static bool CallRequiresGOTPtrInReg(const TargetMachine &TM) { const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>(); - return !IsTailCall && !Subtarget.is64Bit() && - TM.getRelocationModel() == Reloc::PIC_ && + return TM.getRelocationModel() == Reloc::PIC_ && Subtarget.isPICStyleGOT(); } /// CallRequiresFnAddressInReg - Check whether the call requires the function /// address to be loaded in a register. -static bool CallRequiresFnAddressInReg(const TargetMachine &TM, - bool IsTailCall) { +static bool CallRequiresFnAddressInReg(const TargetMachine &TM) { const X86Subtarget &Subtarget = TM.getSubtarget<X86Subtarget>(); - return !Subtarget.is64Bit() && IsTailCall && - TM.getRelocationModel() == Reloc::PIC_ && + return TM.getRelocationModel() == Reloc::PIC_ && Subtarget.isPICStyleGOT(); } @@ -1808,7 +1804,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) { // ELF / PIC requires GOT in the EBX register before function calls via PLT // GOT pointer. - if (CallRequiresGOTPtrInReg(getTargetMachine(), IsTailCall)) { + if (!IsTailCall && CallRequiresGOTPtrInReg(getTargetMachine())) { Chain = DAG.getCopyToReg(Chain, dl, X86::EBX, DAG.getNode(X86ISD::GlobalBaseReg, DebugLoc::getUnknownLoc(), @@ -1823,7 +1819,7 @@ SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) { // calls on PIC/GOT architectures. Normally we would just put the address of // GOT into ebx and then call target@PLT. But for tail calls ebx would be // restored (since ebx is callee saved) before jumping to the target@PLT. - if (CallRequiresFnAddressInReg(getTargetMachine(), IsTailCall)) { + if (IsTailCall && CallRequiresFnAddressInReg(getTargetMachine())) { // Note: The actual moving to ecx is done further down. GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee); if (G && !G->getGlobal()->hasHiddenVisibility() && |

