From: Chris Lattner Date: Tue, 5 Jul 2005 19:58:54 +0000 (+0000) Subject: Make several cleanups to Andrews varargs change: X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=e0fe225e8912b6308e3e1db442ba7b96d9f09ff3;p=oota-llvm.git Make several cleanups to Andrews varargs change: 1. Pass Value*'s into lowering methods so that the proper pointers can be added to load/stores from the valist 2. Intrinsics that return void should only return a token chain, not a token chain/retval pair. 3. Rename LowerVAArgNext -> LowerVAArg, because VANext is long gone. 4. Now that we have Value*'s available in the lowering methods, pass them into any load/stores from the valist that are emitted git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22339 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/Alpha/AlphaISelPattern.cpp b/lib/Target/Alpha/AlphaISelPattern.cpp index bef529308e7..c5556ed9f25 100644 --- a/lib/Target/Alpha/AlphaISelPattern.cpp +++ b/lib/Target/Alpha/AlphaISelPattern.cpp @@ -156,21 +156,15 @@ namespace { bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); - virtual std::pair - LowerVAStart(SDOperand Chain, SelectionDAG &DAG, SDOperand Dest); - + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG); + virtual SDOperand LowerVACopy(SDOperand Chain, SDOperand SrcP, Value *SrcV, + SDOperand DestP, Value *DestV, + SelectionDAG &DAG); virtual std::pair - LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG); - - std::pair - LowerVACopy(SDOperand Chain, SDOperand Src, SDOperand Dest, - SelectionDAG &DAG); - - virtual std::pair - LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, - SelectionDAG &DAG); - + LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG); + void restoreGP(MachineBasicBlock* BB) { BuildMI(BB, Alpha::BIS, 2, Alpha::R29).addReg(GP).addReg(GP); @@ -415,35 +409,34 @@ AlphaTargetLowering::LowerCallTo(SDOperand Chain, return std::make_pair(TheCall, Chain); } -std::pair -AlphaTargetLowering::LowerVAStart(SDOperand Chain, SelectionDAG &DAG, - SDOperand Dest) { - // vastart just stores the address of the VarArgsBase and VarArgsOffset +SDOperand AlphaTargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG) { + // vastart stores the address of the VarArgsBase and VarArgsOffset SDOperand FR = DAG.getFrameIndex(VarArgsBase, MVT::i64); - SDOperand S1 = DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, Dest, - DAG.getSrcValue(NULL)); - SDOperand SA2 = DAG.getNode(ISD::ADD, MVT::i64, Dest, + SDOperand S1 = DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, VAListP, + DAG.getSrcValue(VAListV)); + SDOperand SA2 = DAG.getNode(ISD::ADD, MVT::i64, VAListP, DAG.getConstant(8, MVT::i64)); - SDOperand S2 = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, S1, - DAG.getConstant(VarArgsOffset, MVT::i64), SA2, - DAG.getSrcValue(NULL), MVT::i32); - return std::make_pair(S2, S2); + return DAG.getNode(ISD::TRUNCSTORE, MVT::Other, S1, + DAG.getConstant(VarArgsOffset, MVT::i64), SA2, + DAG.getSrcValue(VAListV, 8), MVT::i32); } std::pair AlphaTargetLowering:: -LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG) { - SDOperand Base = DAG.getLoad(MVT::i64, Chain, VAList, DAG.getSrcValue(NULL)); - SDOperand Tmp = DAG.getNode(ISD::ADD, MVT::i64, VAList, +LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG) { + SDOperand Base = DAG.getLoad(MVT::i64, Chain, VAListP, + DAG.getSrcValue(VAListV)); + SDOperand Tmp = DAG.getNode(ISD::ADD, MVT::i64, VAListP, DAG.getConstant(8, MVT::i64)); SDOperand Offset = DAG.getNode(ISD::SEXTLOAD, MVT::i64, Base.getValue(1), - Tmp, DAG.getSrcValue(NULL), MVT::i32); + Tmp, DAG.getSrcValue(VAListV, 8), MVT::i32); SDOperand DataPtr = DAG.getNode(ISD::ADD, MVT::i64, Base, Offset); if (ArgTy->isFloatingPoint()) { //if fp && Offset < 6*8, then subtract 6*8 from DataPtr SDOperand FPDataPtr = DAG.getNode(ISD::SUB, MVT::i64, DataPtr, - DAG.getConstant(8*6, MVT::i64)); + DAG.getConstant(8*6, MVT::i64)); SDOperand CC = DAG.getSetCC(ISD::SETLT, MVT::i64, Offset, DAG.getConstant(8*6, MVT::i64)); DataPtr = DAG.getNode(ISD::SELECT, MVT::i64, CC, FPDataPtr, DataPtr); @@ -464,41 +457,30 @@ LowerVAArgNext(SDOperand Chain, SDOperand VAList, DAG.getConstant(8, MVT::i64)); SDOperand Update = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Result.getValue(1), NewOffset, - Tmp, DAG.getSrcValue(NULL), MVT::i32); + Tmp, DAG.getSrcValue(VAListV, 8), MVT::i32); Result = DAG.getNode(ISD::TRUNCATE, getValueType(ArgTy), Result); return std::make_pair(Result, Update); } -std::pair AlphaTargetLowering:: -LowerVACopy(SDOperand Chain, SDOperand Src, SDOperand Dest, - SelectionDAG &DAG) { - //Default to returning the input list - SDOperand Val = DAG.getLoad(getPointerTy(), Chain, Src, - DAG.getSrcValue(NULL)); + +SDOperand AlphaTargetLowering:: +LowerVACopy(SDOperand Chain, SDOperand SrcP, Value *SrcV, SDOperand DestP, + Value *DestV, SelectionDAG &DAG) { + SDOperand Val = DAG.getLoad(getPointerTy(), Chain, SrcP, + DAG.getSrcValue(SrcV)); SDOperand Result = DAG.getNode(ISD::STORE, MVT::Other, Val.getValue(1), - Val, Dest, DAG.getSrcValue(NULL)); - SDOperand NP = DAG.getNode(ISD::ADD, MVT::i64, Src, + Val, DestP, DAG.getSrcValue(DestV)); + SDOperand NP = DAG.getNode(ISD::ADD, MVT::i64, SrcP, DAG.getConstant(8, MVT::i64)); - Val = DAG.getNode(ISD::SEXTLOAD, MVT::i64, Result, NP, DAG.getSrcValue(NULL), - MVT::i32); - SDOperand NPD = DAG.getNode(ISD::ADD, MVT::i64, Dest, + Val = DAG.getNode(ISD::SEXTLOAD, MVT::i64, Result, NP, + DAG.getSrcValue(SrcV, 8), MVT::i32); + SDOperand NPD = DAG.getNode(ISD::ADD, MVT::i64, DestP, DAG.getConstant(8, MVT::i64)); - Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Val.getValue(1), - Val, NPD, DAG.getSrcValue(NULL), MVT::i32); - return std::make_pair(Result, Result); -} - -std::pair AlphaTargetLowering:: -LowerFrameReturnAddress(bool isFrameAddress, SDOperand Chain, unsigned Depth, - SelectionDAG &DAG) { - abort(); + return DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Val.getValue(1), + Val, NPD, DAG.getSrcValue(DestV, 8), MVT::i32); } - - - - namespace { //===--------------------------------------------------------------------===// diff --git a/lib/Target/IA64/IA64ISelPattern.cpp b/lib/Target/IA64/IA64ISelPattern.cpp index 804ad9937ef..a93e2ead274 100644 --- a/lib/Target/IA64/IA64ISelPattern.cpp +++ b/lib/Target/IA64/IA64ISelPattern.cpp @@ -113,16 +113,11 @@ namespace { bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); - virtual std::pair - LowerVAStart(SDOperand Chain, SelectionDAG &DAG, SDOperand Dest); - + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG); virtual std::pair - LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG); - - virtual std::pair - LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, - SelectionDAG &DAG); + LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG); void restoreGP_SP_RP(MachineBasicBlock* BB) { @@ -379,21 +374,24 @@ IA64TargetLowering::LowerCallTo(SDOperand Chain, return std::make_pair(TheCall, Chain); } -std::pair -IA64TargetLowering::LowerVAStart(SDOperand Chain, SelectionDAG &DAG, SDOperand Dest) { +SDOperand +IA64TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG) { // vastart just stores the address of the VarArgsFrameIndex slot. SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i64); - SDOperand Result = DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, Dest, DAG.getSrcValue(NULL)); - return std::make_pair(Result, Result); + return DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, + VAListP, DAG.getSrcValue(VAListV)); } std::pair IA64TargetLowering:: -LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG) { +LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG) { MVT::ValueType ArgVT = getValueType(ArgTy); - SDOperand Val = DAG.getLoad(MVT::i64, Chain, VAList, DAG.getSrcValue(NULL)); - SDOperand Result = DAG.getLoad(ArgVT, DAG.getEntryNode(), Val, DAG.getSrcValue(NULL)); + SDOperand Val = DAG.getLoad(MVT::i64, Chain, + VAListP, DAG.getSrcValue(VAListV)); + SDOperand Result = DAG.getLoad(ArgVT, DAG.getEntryNode(), Val, + DAG.getSrcValue(NULL)); unsigned Amt; if (ArgVT == MVT::i32 || ArgVT == MVT::f32) Amt = 8; @@ -405,19 +403,10 @@ LowerVAArgNext(SDOperand Chain, SDOperand VAList, Val = DAG.getNode(ISD::ADD, Val.getValueType(), Val, DAG.getConstant(Amt, Val.getValueType())); Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, - Val, VAList, DAG.getSrcValue(NULL)); + Val, VAListP, DAG.getSrcValue(VAListV)); return std::make_pair(Result, Chain); } -std::pair IA64TargetLowering:: -LowerFrameReturnAddress(bool isFrameAddress, SDOperand Chain, unsigned Depth, - SelectionDAG &DAG) { - - assert(0 && "LowerFrameReturnAddress not done yet\n"); - abort(); -} - - namespace { //===--------------------------------------------------------------------===// diff --git a/lib/Target/PowerPC/PPCISelPattern.cpp b/lib/Target/PowerPC/PPCISelPattern.cpp index 00990023c15..b29b11f182b 100644 --- a/lib/Target/PowerPC/PPCISelPattern.cpp +++ b/lib/Target/PowerPC/PPCISelPattern.cpp @@ -97,13 +97,13 @@ namespace { bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); - virtual std::pair - LowerVAStart(SDOperand Chain, SelectionDAG &DAG, SDOperand Dest); - + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG); + virtual std::pair - LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG); - + LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG); + virtual std::pair LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, SelectionDAG &DAG); @@ -463,26 +463,24 @@ PPC32TargetLowering::LowerCallTo(SDOperand Chain, return std::make_pair(TheCall, Chain); } -std::pair -PPC32TargetLowering::LowerVAStart(SDOperand Chain, SelectionDAG &DAG, - SDOperand Dest) { +SDOperand PPC32TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG) { // vastart just stores the address of the VarArgsFrameIndex slot into the // memory location argument. SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i32); - SDOperand Result = DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, Dest, - DAG.getSrcValue(NULL)); - return std::make_pair(Result, Result); + return DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, VAListP, + DAG.getSrcValue(VAListV)); } -std::pair PPC32TargetLowering:: -LowerVAArgNext(SDOperand Chain, SDOperand VAArgOp, - const Type *ArgTy, SelectionDAG &DAG) { +std::pair +PPC32TargetLowering::LowerVAArg(SDOperand Chain, + SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG) { MVT::ValueType ArgVT = getValueType(ArgTy); SDOperand VAList = - DAG.getLoad(MVT::i32, Chain, VAArgOp, DAG.getSrcValue(NULL)); - SDOperand Result = DAG.getLoad(ArgVT, VAList.getValue(1), VAList, - DAG.getSrcValue(NULL)); + DAG.getLoad(MVT::i32, Chain, VAListP, DAG.getSrcValue(VAListV)); + SDOperand Result = DAG.getLoad(ArgVT, Chain, VAList, DAG.getSrcValue(NULL)); unsigned Amt; if (ArgVT == MVT::i32 || ArgVT == MVT::f32) Amt = 4; @@ -494,7 +492,7 @@ LowerVAArgNext(SDOperand Chain, SDOperand VAArgOp, VAList = DAG.getNode(ISD::ADD, VAList.getValueType(), VAList, DAG.getConstant(Amt, VAList.getValueType())); Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, - VAList, VAArgOp, DAG.getSrcValue(NULL)); + VAList, VAListP, DAG.getSrcValue(VAListV)); return std::make_pair(Result, Chain); } diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp index f6a118dffd7..bc728a7a41b 100644 --- a/lib/Target/X86/X86ISelPattern.cpp +++ b/lib/Target/X86/X86ISelPattern.cpp @@ -175,13 +175,12 @@ namespace { bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); - virtual std::pair - LowerVAStart(SDOperand Chain, SelectionDAG &DAG, SDOperand Dest); - + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG); virtual std::pair - LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG); - + LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, + const Type *ArgTy, SelectionDAG &DAG); + virtual std::pair LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth, SelectionDAG &DAG); @@ -442,22 +441,24 @@ X86TargetLowering::LowerCCCCallTo(SDOperand Chain, const Type *RetTy, return std::make_pair(ResultVal, Chain); } -std::pair -X86TargetLowering::LowerVAStart(SDOperand Chain, SelectionDAG &DAG, - SDOperand Dest) { +SDOperand +X86TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, + Value *VAListV, SelectionDAG &DAG) { // vastart just stores the address of the VarArgsFrameIndex slot. SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, MVT::i32); - SDOperand Result = DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, Dest, - DAG.getSrcValue(NULL)); - return std::make_pair(Result, Result); + return DAG.getNode(ISD::STORE, MVT::Other, Chain, FR, VAListP, + DAG.getSrcValue(VAListV)); } -std::pair -X86TargetLowering::LowerVAArgNext(SDOperand Chain, SDOperand VAList, - const Type *ArgTy, SelectionDAG &DAG) { + +std::pair +X86TargetLowering::LowerVAArg(SDOperand Chain, SDOperand VAListP, + Value *VAListV, const Type *ArgTy, + SelectionDAG &DAG) { MVT::ValueType ArgVT = getValueType(ArgTy); - SDOperand Val = DAG.getLoad(MVT::i32, Chain, VAList, DAG.getSrcValue(NULL)); - SDOperand Result = DAG.getLoad(ArgVT, Val.getValue(1), Val, + SDOperand Val = DAG.getLoad(MVT::i32, Chain, + VAListP, DAG.getSrcValue(VAListV)); + SDOperand Result = DAG.getLoad(ArgVT, Chain, Val, DAG.getSrcValue(NULL)); unsigned Amt; if (ArgVT == MVT::i32) @@ -470,7 +471,7 @@ X86TargetLowering::LowerVAArgNext(SDOperand Chain, SDOperand VAList, Val = DAG.getNode(ISD::ADD, Val.getValueType(), Val, DAG.getConstant(Amt, Val.getValueType())); Chain = DAG.getNode(ISD::STORE, MVT::Other, Chain, - Val, VAList, DAG.getSrcValue(NULL)); + Val, VAListP, DAG.getSrcValue(VAListV)); return std::make_pair(Result, Chain); }