mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 10:04:33 +00:00
* 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:
parent
5443779d5a
commit
45a7ca9b23
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user