forked from OSchip/llvm-project
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,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;
|
||||
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 {
|
||||
// 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->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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue