From 28269139ee22c95ab18064b453f52e4e016fa833 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 18 Apr 2008 20:55:41 +0000 Subject: [PATCH] Fix the handling of va_copy on x86-64. As of llvm-gcc r49920 llvm-gcc is now lowering va_copy on x86-64, so this completes the fix for PR2230. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49922 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index e01f140ef31..0e27c00e4af 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -4954,26 +4954,16 @@ SDOperand X86TargetLowering::LowerVASTART(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerVACOPY(SDOperand Op, SelectionDAG &DAG) { // X86-64 va_list is a struct { i32, i32, i8*, i8* }. + assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!"); SDOperand Chain = Op.getOperand(0); SDOperand DstPtr = Op.getOperand(1); SDOperand SrcPtr = Op.getOperand(2); const Value *DstSV = cast(Op.getOperand(3))->getValue(); const Value *SrcSV = cast(Op.getOperand(4))->getValue(); - SrcPtr = DAG.getLoad(getPointerTy(), Chain, SrcPtr, SrcSV, 0); - Chain = SrcPtr.getValue(1); - for (unsigned i = 0; i < 3; ++i) { - SDOperand Val = DAG.getLoad(MVT::i64, Chain, SrcPtr, SrcSV, 0); - Chain = Val.getValue(1); - Chain = DAG.getStore(Chain, Val, DstPtr, DstSV, 0); - if (i == 2) - break; - SrcPtr = DAG.getNode(ISD::ADD, getPointerTy(), SrcPtr, - DAG.getIntPtrConstant(8)); - DstPtr = DAG.getNode(ISD::ADD, getPointerTy(), DstPtr, - DAG.getIntPtrConstant(8)); - } - return Chain; + return DAG.getMemcpy(Chain, DstPtr, SrcPtr, + DAG.getIntPtrConstant(24), 8, false, + DstSV, 0, SrcSV, 0); } SDOperand