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:
Chris Lattner 2005-12-01 23:14:50 +00:00
parent e4ffb9a57d
commit 0142afd6c1
1 changed files with 39 additions and 36 deletions

View File

@ -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;
} }