diff options
| author | Dale Johannesen <dalej@apple.com> | 2008-03-05 23:31:27 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2008-03-05 23:31:27 +0000 |
| commit | 0d235052d18b8873040465c290aa54ea98483141 (patch) | |
| tree | c616b085f94da85db1e6f4fe60e3ab2a06ab6259 /llvm/lib/Target | |
| parent | 2609888f29b356694123900f48ead8dedb24fcf3 (diff) | |
| download | bcm5719-llvm-0d235052d18b8873040465c290aa54ea98483141.tar.gz bcm5719-llvm-0d235052d18b8873040465c290aa54ea98483141.zip | |
Next bit of PPC ByVal handling; call-site code seems
correct now.
llvm-svn: 47978
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 5ae71accba3..9ac5694e35a 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -1583,7 +1583,7 @@ CreateCopyOfByValArgument(SDOperand Src, SDOperand Dst, SDOperand Chain, ((Flags & ISD::ParamFlags::ByValAlign) >> ISD::ParamFlags::ByValAlignOffs); SDOperand AlignNode = DAG.getConstant(Align, MVT::i32); SDOperand SizeNode = DAG.getConstant(Size, MVT::i32); - SDOperand AlwaysInline = DAG.getConstant(1, MVT::i32); + SDOperand AlwaysInline = DAG.getConstant(0, MVT::i32); return DAG.getMemcpy(Chain, Dst, Src, SizeNode, AlignNode, AlwaysInline); } @@ -1633,6 +1633,7 @@ SDOperand PPCTargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG, // These operations are automatically eliminated by the prolog/epilog pass Chain = DAG.getCALLSEQ_START(Chain, DAG.getConstant(NumBytes, PtrVT)); + SDOperand CallSeqStart = Chain; // Set up a copy of the stack pointer for use loading and storing any // arguments that may not fit in the registers available for argument @@ -1713,13 +1714,20 @@ SDOperand PPCTargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG, SDOperand AddArg = DAG.getNode(ISD::ADD, PtrVT, Arg, Const); if (GPR_idx != NumGPRs) { SDOperand Load = DAG.getLoad(PtrVT, Chain, AddArg, NULL, 0); + MemOpChains.push_back(Load.getValue(1)); RegsToPass.push_back(std::make_pair(GPR[GPR_idx++], Load)); if (isMachoABI) ArgOffset += PtrByteSize; } else { SDOperand AddPtr = DAG.getNode(ISD::ADD, PtrVT, PtrOff, Const); - MemOpChains.push_back(CreateCopyOfByValArgument(AddArg, AddPtr, - Chain, Flags, DAG, Size - j)); + SDOperand MemcpyCall = CreateCopyOfByValArgument(AddArg, AddPtr, + CallSeqStart.Val->getOperand(0), + Flags, DAG, Size - j); + // This must go outside the CALLSEQ_START..END. + SDOperand NewCallSeqStart = DAG.getCALLSEQ_START(MemcpyCall, + CallSeqStart.Val->getOperand(1)); + DAG.ReplaceAllUsesWith(CallSeqStart.Val, NewCallSeqStart.Val); + CallSeqStart = NewCallSeqStart; ArgOffset += ((Size - j + 3)/4)*4; } } |

