mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Generalize one of the SelectionDAG::ReplaceAllUsesWith overloads
to support replacing a node with another that has a superset of the result types. Use this instead of calling ReplaceAllUsesOfValueWith for each value. llvm-svn: 69209
This commit is contained in:
parent
049e984de6
commit
5555c4538b
@ -80,15 +80,8 @@ void ReplaceUses(const SDValue *F, const SDValue *T,
|
||||
/// ReplaceUses - replace all uses of the old node F with the use
|
||||
/// of the new node T.
|
||||
void ReplaceUses(SDNode *F, SDNode *T) DISABLE_INLINE {
|
||||
unsigned FNumVals = F->getNumValues();
|
||||
unsigned TNumVals = T->getNumValues();
|
||||
ISelUpdater ISU(ISelPosition);
|
||||
if (FNumVals != TNumVals) {
|
||||
for (unsigned i = 0, e = std::min(FNumVals, TNumVals); i < e; ++i)
|
||||
CurDAG->ReplaceAllUsesOfValueWith(SDValue(F, i), SDValue(T, i), &ISU);
|
||||
} else {
|
||||
CurDAG->ReplaceAllUsesWith(F, T, &ISU);
|
||||
}
|
||||
CurDAG->ReplaceAllUsesWith(F, T, &ISU);
|
||||
}
|
||||
|
||||
/// SelectRoot - Top level entry to DAG instruction selector.
|
||||
|
@ -693,7 +693,8 @@ public:
|
||||
/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
|
||||
/// This can cause recursive merging of nodes in the DAG. Use the first
|
||||
/// version if 'From' is known to have a single result, use the second
|
||||
/// if you have two nodes with identical results, use the third otherwise.
|
||||
/// if you have two nodes with identical results (or if 'To' has a superset
|
||||
/// of the results of 'From'), use the third otherwise.
|
||||
///
|
||||
/// These methods all take an optional UpdateListener, which (if not null) is
|
||||
/// informed about nodes that are deleted and modified due to recursive
|
||||
|
@ -4420,8 +4420,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
DAG.getVTList(&ValueVTs[0], 2),
|
||||
&Ops[0], 2);
|
||||
SDNode *RNode = Result.getNode();
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0));
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1));
|
||||
DAG.ReplaceAllUsesWith(Node, RNode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4456,8 +4455,7 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
|
||||
DAG.getVTList(&ValueVTs[0], 2),
|
||||
&Ops[0], 2);
|
||||
SDNode *RNode = Result.getNode();
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0));
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1));
|
||||
DAG.ReplaceAllUsesWith(Node, RNode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4500,14 +4500,17 @@ void SelectionDAG::ReplaceAllUsesWith(SDValue FromN, SDValue To,
|
||||
/// ReplaceAllUsesWith - Modify anything using 'From' to use 'To' instead.
|
||||
/// This can cause recursive merging of nodes in the DAG.
|
||||
///
|
||||
/// This version assumes From/To have matching types and numbers of result
|
||||
/// values.
|
||||
/// This version assumes that for each value of From, there is a
|
||||
/// corresponding value in To in the same position with the same type.
|
||||
///
|
||||
void SelectionDAG::ReplaceAllUsesWith(SDNode *From, SDNode *To,
|
||||
DAGUpdateListener *UpdateListener) {
|
||||
assert(From->getVTList().VTs == To->getVTList().VTs &&
|
||||
From->getNumValues() == To->getNumValues() &&
|
||||
"Cannot use this version of ReplaceAllUsesWith!");
|
||||
#ifndef NDEBUG
|
||||
for (unsigned i = 0, e = From->getNumValues(); i != e; ++i)
|
||||
assert((!From->hasAnyUseOfValue(i) ||
|
||||
From->getValueType(i) == To->getValueType(i)) &&
|
||||
"Cannot use this version of ReplaceAllUsesWith!");
|
||||
#endif
|
||||
|
||||
// Handle the trivial case.
|
||||
if (From == To)
|
||||
|
Loading…
x
Reference in New Issue
Block a user