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
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8b1deb3..0605352 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -388,43 +388,46 @@
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;
}