diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-05-01 00:38:21 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-05-01 00:38:21 +0000 |
commit | a684cd23a5307d7a8ce302e24977302ebcf71c49 (patch) | |
tree | a51c87355aecefc2eadd8f8787578e5f26a29e87 /llvm | |
parent | 7c30c26fcb3b88597ef9450439fd68baa5e99d24 (diff) | |
download | bcm5719-llvm-a684cd23a5307d7a8ce302e24977302ebcf71c49.tar.gz bcm5719-llvm-a684cd23a5307d7a8ce302e24977302ebcf71c49.zip |
* Only turn a load to UNDEF if all of its outputs have no uses (indexed loads
produce two results.)
* Do not touch volatile loads.
llvm-svn: 36604
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 2cbd10dc543..4b57ecfcbcf 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3326,11 +3326,26 @@ SDOperand DAGCombiner::visitLOAD(SDNode *N) { LoadSDNode *LD = cast<LoadSDNode>(N); SDOperand Chain = LD->getChain(); SDOperand Ptr = LD->getBasePtr(); - - // If there are no uses of the loaded value, change uses of the chain value - // into uses of the chain input (i.e. delete the dead load). - if (N->hasNUsesOfValue(0, 0)) - return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain); + + // If load is not volatile and there are no uses of the loaded value (and + // the updated indexed value in case of indexed loads), change uses of the + // chain value into uses of the chain input (i.e. delete the dead load). + if (!LD->isVolatile()) { + bool HasUses = false; + SmallVector<MVT::ValueType, 2> VTs; + for (unsigned i = 0, e = N->getNumValues(); i != e; ++i) { + if (!N->hasNUsesOfValue(0, i)) { + HasUses = true; + break; + } + VTs.push_back(N->getValueType(i)); + } + if (!HasUses) { + SmallVector<SDOperand, 1> Ops; + return CombineTo(N, DAG.getNode(ISD::UNDEF, &VTs[0], VTs.size(), 0, 0), + Chain); + } + } // If this load is directly stored, replace the load value with the stored // value. |