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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24571 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-12-01 23:14:50 +00:00
parent 43cb6effd3
commit fe14b34d83

View File

@ -388,43 +388,46 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
assert(N->getNumOperands() && "This is a leaf node!");
if (N->getOpcode() == ISD::CALLSEQ_START ||
N->getOpcode() == ISD::CALLSEQ_END)
return 0;
N->getOpcode() == ISD::CALLSEQ_END ||
N->getOpcode() == ISD::HANDLENODE)
return 0; // Never add these nodes.
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 if (N->getOpcode() == ISD::HANDLENODE) {
return 0; // never add it.
} else if (N->getNumOperands() == 1) {
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
std::make_pair(N->getOperand(0),
N->getValueType(0)))];
if (U) return U;
U = N;
} else if (N->getNumOperands() == 2) {
SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
std::make_pair(N->getOperand(0),
N->getOperand(1)))];
if (B) return B;
B = N;
} else if (N->getNumValues() == 1) {
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
std::make_pair(N->getValueType(0), Ops))];
if (ORN) return ORN;
ORN = N;
} else {
// Remove the node from the ArbitraryNodes map.
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
std::make_pair(RV, Ops))];
if (AN) return AN;
AN = N;
if (N->getNumValues() == 1) {
if (N->getNumOperands() == 1) {
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
std::make_pair(N->getOperand(0),
N->getValueType(0)))];
if (U) return U;
U = N;
} else if (N->getNumOperands() == 2) {
SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
std::make_pair(N->getOperand(0),
N->getOperand(1)))];
if (B) return B;
B = N;
} else {
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
std::make_pair(N->getValueType(0), Ops))];
if (ORN) return ORN;
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 {
// Remove the node from the ArbitraryNodes map.
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
std::make_pair(RV, Ops))];
if (AN) return AN;
AN = N;
}
}
return 0;
}