diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-01-19 18:02:17 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-01-19 18:02:17 +0000 |
| commit | 0d03eb45a80a20386fdf46a152bd2c9b0c3e026f (patch) | |
| tree | e9ddb3386ad6251fe8cd8c4852b0b31ca5a31173 /llvm/lib/CodeGen/SelectionDAG | |
| parent | 9b75e148fdc7453cf7804eac9faa142ed19ca541 (diff) | |
| download | bcm5719-llvm-0d03eb45a80a20386fdf46a152bd2c9b0c3e026f.tar.gz bcm5719-llvm-0d03eb45a80a20386fdf46a152bd2c9b0c3e026f.zip | |
Realize the individual pieces of an expanded copytoreg/store/load are
independent of each other.
llvm-svn: 19700
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index b560acb5053..2994d4812b8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -399,8 +399,10 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { SDOperand Lo, Hi; ExpandOp(Node->getOperand(1), Lo, Hi); unsigned Reg = cast<RegSDNode>(Node)->getReg(); - Result = DAG.getCopyToReg(Tmp1, Lo, Reg); - Result = DAG.getCopyToReg(Result, Hi, Reg+1); + Lo = DAG.getCopyToReg(Tmp1, Lo, Reg); + Hi = DAG.getCopyToReg(Tmp1, Hi, Reg+1); + // Note that the copytoreg nodes are independent of each other. + Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi); assert(isTypeLegal(Result.getValueType()) && "Cannot expand multiple times yet (i64 -> i16)"); break; @@ -506,15 +508,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) { if (!TLI.isLittleEndian()) std::swap(Lo, Hi); - // FIXME: These two stores are independent of each other! - Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Lo, Tmp2); + Lo = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Lo, Tmp2); - unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8; + unsigned IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8; Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2, getIntPtrConstant(IncrementSize)); assert(isTypeLegal(Tmp2.getValueType()) && "Pointers must be legal!"); - Result = DAG.getNode(ISD::STORE, MVT::Other, Result, Hi, Tmp2); + Hi = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Hi, Tmp2); + Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi); + break; } break; case ISD::TRUNCSTORE: @@ -1292,11 +1295,15 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8; Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr, getIntPtrConstant(IncrementSize)); - // FIXME: This load is independent of the first one. - Hi = DAG.getLoad(NVT, Lo.getValue(1), Ptr); + Hi = DAG.getLoad(NVT, Ch, Ptr); + + // Build a factor node to remember that this load is independent of the + // other one. + SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1), + Hi.getValue(1)); // Remember that we legalized the chain. - AddLegalizedOperand(Op.getValue(1), Hi.getValue(1)); + AddLegalizedOperand(Op.getValue(1), TF); if (!TLI.isLittleEndian()) std::swap(Lo, Hi); break; |

