* Only turn a load to UNDEF if all of its outputs have no uses (indexed loads

produce two results.)
* Do not touch volatile loads.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36604 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-05-01 00:38:21 +00:00
parent 5443779d5a
commit 45a7ca9b23

View File

@ -3326,11 +3326,26 @@ SDOperand DAGCombiner::visitLOAD(SDNode *N) {
LoadSDNode *LD = cast<LoadSDNode>(N); LoadSDNode *LD = cast<LoadSDNode>(N);
SDOperand Chain = LD->getChain(); SDOperand Chain = LD->getChain();
SDOperand Ptr = LD->getBasePtr(); SDOperand Ptr = LD->getBasePtr();
// If there are no uses of the loaded value, change uses of the chain value // If load is not volatile and there are no uses of the loaded value (and
// into uses of the chain input (i.e. delete the dead load). // the updated indexed value in case of indexed loads), change uses of the
if (N->hasNUsesOfValue(0, 0)) // chain value into uses of the chain input (i.e. delete the dead load).
return CombineTo(N, DAG.getNode(ISD::UNDEF, N->getValueType(0)), Chain); 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 // If this load is directly stored, replace the load value with the stored
// value. // value.