diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-10-13 21:44:47 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-10-13 21:44:47 +0000 |
| commit | 258521d7ea746d47c48b7b90a7acfaf999371e2b (patch) | |
| tree | 82096d87cd3a877e8fd3157d59e0457741392de1 /llvm/lib | |
| parent | d23f4b741192f53f7b51472ab6aa09e6804af0a9 (diff) | |
| download | bcm5719-llvm-258521d7ea746d47c48b7b90a7acfaf999371e2b.tar.gz bcm5719-llvm-258521d7ea746d47c48b7b90a7acfaf999371e2b.zip | |
When ExpandOp'ing a [SZ]EXTLOAD, make sure to remember that the chain
is also legal. Add support for ExpandOp'ing raw EXTLOADs too.
llvm-svn: 23716
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 3fcf45afe38..3363c3d1feb 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -3121,6 +3121,10 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ else Lo = DAG.getExtLoad(ISD::SEXTLOAD, NVT, Chain, Ptr, Node->getOperand(2), EVT); + + // Remember that we legalized the chain. + AddLegalizedOperand(SDOperand(Node, 1), Lo.getValue(1)); + // The high part is obtained by SRA'ing all but one of the bits of the lo // part. unsigned LoSize = MVT::getSizeInBits(Lo.getValueType()); @@ -3140,10 +3144,32 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){ else Lo = DAG.getExtLoad(ISD::ZEXTLOAD, NVT, Chain, Ptr, Node->getOperand(2), EVT); + + // Remember that we legalized the chain. + AddLegalizedOperand(SDOperand(Node, 1), Lo.getValue(1)); + // The high part is just a zero. - Hi = DAG.getConstant(0, NVT); + Hi = LegalizeOp(DAG.getConstant(0, NVT)); + Lo = LegalizeOp(Lo); + break; + } + case ISD::EXTLOAD: { + SDOperand Chain = LegalizeOp(Node->getOperand(0)); + SDOperand Ptr = LegalizeOp(Node->getOperand(1)); + MVT::ValueType EVT = cast<VTSDNode>(Node->getOperand(3))->getVT(); + + if (EVT == NVT) + Lo = DAG.getLoad(NVT, Chain, Ptr, Node->getOperand(2)); + else + Lo = DAG.getExtLoad(ISD::EXTLOAD, NVT, Chain, Ptr, Node->getOperand(2), + EVT); + + // Remember that we legalized the chain. + AddLegalizedOperand(SDOperand(Node, 1), Lo.getValue(1)); + + // The high part is undefined. + Hi = LegalizeOp(DAG.getNode(ISD::UNDEF, NVT)); Lo = LegalizeOp(Lo); - Hi = LegalizeOp(Hi); break; } case ISD::ANY_EXTEND: { |

