diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-03-18 23:36:35 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-03-18 23:36:35 +0000 |
commit | 8ba45e6e0f68cb1ba7a611393b805eb3db43fb2e (patch) | |
tree | 682f446f9c79f5777e22a726ca0340583b1812d0 /lib/Target | |
parent | 6de83ffc8986b3147b2989231a11da119e7e0fba (diff) | |
download | external_llvm-8ba45e6e0f68cb1ba7a611393b805eb3db43fb2e.zip external_llvm-8ba45e6e0f68cb1ba7a611393b805eb3db43fb2e.tar.gz external_llvm-8ba45e6e0f68cb1ba7a611393b805eb3db43fb2e.tar.bz2 |
Fix a x86-64 isel lowering bug that's been around forever. A x86-64 varargs function implicitly reads X86::AL, don't clobber it!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48515 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 8655eff..5a05aba 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1746,18 +1746,22 @@ SDOperand X86TargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG) { if (IsTailCall) Ops.push_back(DAG.getConstant(FPDiff, MVT::i32)); - // Add an implicit use GOT pointer in EBX. - if (!IsTailCall && !Is64Bit && - getTargetMachine().getRelocationModel() == Reloc::PIC_ && - Subtarget->isPICStyleGOT()) - Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy())); - // Add argument registers to the end of the list so that they are known live // into the call. for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) Ops.push_back(DAG.getRegister(RegsToPass[i].first, RegsToPass[i].second.getValueType())); + // Add an implicit use GOT pointer in EBX. + if (!IsTailCall && !Is64Bit && + getTargetMachine().getRelocationModel() == Reloc::PIC_ && + Subtarget->isPICStyleGOT()) + Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy())); + + // Add an implicit use of AL for x86 vararg functions. + if (Is64Bit && isVarArg) + Ops.push_back(DAG.getRegister(X86::AL, MVT::i8)); + if (InFlag.Val) Ops.push_back(InFlag); |