Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAG.cpp updated: 1.221 -> 1.222 --- Log message: 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 --- Diffs of the changes: (+40 -37) SelectionDAG.cpp | 77 ++++++++++++++++++++++++++++--------------------------- 1 files changed, 40 insertions(+), 37 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.221 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.222 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.221 Thu Dec 1 12:00:57 2005 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Thu Dec 1 17:14:50 2005 @@ -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; - - 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; + N->getOpcode() == ISD::CALLSEQ_END || + N->getOpcode() == ISD::HANDLENODE) + return 0; // Never add these nodes. + + 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; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits