diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-03-23 02:16:52 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-03-23 02:16:52 +0000 |
commit | 0b063def9809ed59797fd40a616665ac3e675657 (patch) | |
tree | f66484e0f1db9cabfb1aac7f5f5250135a5e0427 /lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | a03d45fa881b34cfbd1493b1b9cdc36f3fd0927b (diff) |
A couple of bug fixes for reducing load width xform:
1. Address offset is in bytes.
2. Make sure truncate node uses are replaced with new load.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35274 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 7574048bc4..1aea2ed35f 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2017,8 +2017,11 @@ SDOperand DAGCombiner::visitSIGN_EXTEND(SDNode *N) { // fold (sext (truncate (srl (load x), c))) -> (sext (smaller load (x+c/n))) if (N0.getOpcode() == ISD::TRUNCATE) { SDOperand NarrowLoad = ReduceLoadWidth(N0.Val); - if (NarrowLoad.Val) - N0 = NarrowLoad; + if (NarrowLoad.Val) { + if (NarrowLoad.Val != N0.Val) + CombineTo(N0.Val, NarrowLoad); + return DAG.getNode(ISD::SIGN_EXTEND, VT, NarrowLoad); + } } // See if the value being truncated is already sign extended. If so, just @@ -2109,8 +2112,11 @@ SDOperand DAGCombiner::visitZERO_EXTEND(SDNode *N) { // fold (zext (truncate (srl (load x), c))) -> (zext (small load (x+c/n))) if (N0.getOpcode() == ISD::TRUNCATE) { SDOperand NarrowLoad = ReduceLoadWidth(N0.Val); - if (NarrowLoad.Val) - N0 = NarrowLoad; + if (NarrowLoad.Val) { + if (NarrowLoad.Val != N0.Val) + CombineTo(N0.Val, NarrowLoad); + return DAG.getNode(ISD::ZERO_EXTEND, VT, NarrowLoad); + } } // fold (zext (truncate x)) -> (and x, mask) @@ -2189,8 +2195,11 @@ SDOperand DAGCombiner::visitANY_EXTEND(SDNode *N) { // fold (aext (truncate (srl (load x), c))) -> (aext (small load (x+c/n))) if (N0.getOpcode() == ISD::TRUNCATE) { SDOperand NarrowLoad = ReduceLoadWidth(N0.Val); - if (NarrowLoad.Val) - N0 = NarrowLoad; + if (NarrowLoad.Val) { + if (NarrowLoad.Val != N0.Val) + CombineTo(N0.Val, NarrowLoad); + return DAG.getNode(ISD::ANY_EXTEND, VT, NarrowLoad); + } } // fold (aext (truncate x)) @@ -2278,7 +2287,7 @@ SDOperand DAGCombiner::ReduceLoadWidth(SDNode *N) { N0 = N0.getOperand(0); if (MVT::getSizeInBits(N0.getValueType()) <= EVTBits) return SDOperand(); - ShAmt /= EVTBits; + ShAmt /= 8; } } } |