summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-07-09 02:46:53 +0000
committerChris Lattner <sabre@nondot.org>2009-07-09 02:46:53 +0000
commit4d1e9bf7171ae9e9ef8bb74a3f11d17d298063ef (patch)
treee46952a9fec32eda6327a4063584a9442d56c53c /llvm/lib
parent88765d48316d0fc53fa943d6258cfb0e4fcf84e1 (diff)
downloadbcm5719-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/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp16
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() &&
OpenPOWER on IntegriCloud