Don't remove two operand, two result nodes from the binary ops map. These
should come from the arbitrary ops map. This fixes Regression/CodeGen/PowerPC/2005-12-01-Crash.ll llvm-svn: 24571
This commit is contained in:
parent
e4ffb9a57d
commit
0142afd6c1
|
@ -388,18 +388,12 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
|
||||||
SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
||||||
assert(N->getNumOperands() && "This is a leaf node!");
|
assert(N->getNumOperands() && "This is a leaf node!");
|
||||||
if (N->getOpcode() == ISD::CALLSEQ_START ||
|
if (N->getOpcode() == ISD::CALLSEQ_START ||
|
||||||
N->getOpcode() == ISD::CALLSEQ_END)
|
N->getOpcode() == ISD::CALLSEQ_END ||
|
||||||
return 0;
|
N->getOpcode() == ISD::HANDLENODE)
|
||||||
|
return 0; // Never add these nodes.
|
||||||
|
|
||||||
if (N->getOpcode() == ISD::LOAD) {
|
if (N->getNumValues() == 1) {
|
||||||
SDNode *&L = Loads[std::make_pair(N->getOperand(1),
|
if (N->getNumOperands() == 1) {
|
||||||
std::make_pair(N->getOperand(0),
|
|
||||||
N->getValueType(0)))];
|
|
||||||
if (L) return L;
|
|
||||||
L = N;
|
|
||||||
} else if (N->getOpcode() == ISD::HANDLENODE) {
|
|
||||||
return 0; // never add it.
|
|
||||||
} else if (N->getNumOperands() == 1) {
|
|
||||||
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
|
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
|
||||||
std::make_pair(N->getOperand(0),
|
std::make_pair(N->getOperand(0),
|
||||||
N->getValueType(0)))];
|
N->getValueType(0)))];
|
||||||
|
@ -411,12 +405,20 @@ SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
||||||
N->getOperand(1)))];
|
N->getOperand(1)))];
|
||||||
if (B) return B;
|
if (B) return B;
|
||||||
B = N;
|
B = N;
|
||||||
} else if (N->getNumValues() == 1) {
|
} else {
|
||||||
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
||||||
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
|
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
|
||||||
std::make_pair(N->getValueType(0), Ops))];
|
std::make_pair(N->getValueType(0), Ops))];
|
||||||
if (ORN) return ORN;
|
if (ORN) return ORN;
|
||||||
ORN = N;
|
ORN = N;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (N->getOpcode() == ISD::LOAD) {
|
||||||
|
SDNode *&L = Loads[std::make_pair(N->getOperand(1),
|
||||||
|
std::make_pair(N->getOperand(0),
|
||||||
|
N->getValueType(0)))];
|
||||||
|
if (L) return L;
|
||||||
|
L = N;
|
||||||
} else {
|
} else {
|
||||||
// Remove the node from the ArbitraryNodes map.
|
// Remove the node from the ArbitraryNodes map.
|
||||||
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
|
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
|
||||||
|
@ -426,6 +428,7 @@ SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
||||||
if (AN) return AN;
|
if (AN) return AN;
|
||||||
AN = N;
|
AN = N;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue