diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-25 19:12:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-25 19:12:10 +0000 |
commit | 43247a157b613dbf3caedacdbb171a9d653e3ef5 (patch) | |
tree | 5e6f56a4233c72b915d33b444a88380895e3cb5e /lib/CodeGen/SelectionDAG/SelectionDAG.cpp | |
parent | 8064e8fbf4fa0a591ab949c7dab1f2bba87c7adc (diff) |
Don't auto-cse nodes that return flags
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23055 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 9793478dba..7a123aa9aa 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1021,9 +1021,14 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, break; } - SDNode *&N = UnaryOps[std::make_pair(Opcode, std::make_pair(Operand, VT))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Operand); + SDNode *N; + if (VT != MVT::Flag) { // Don't CSE flag producing nodes + SDNode *&E = UnaryOps[std::make_pair(Opcode, std::make_pair(Operand, VT))]; + if (E) return SDOperand(N, 0); + E = N = new SDNode(Opcode, Operand); + } else { + N = new SDNode(Opcode, Operand); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1582,7 +1587,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, // Memoize this node if possible. SDNode *N; - if (Opcode != ISD::CALLSEQ_START && Opcode != ISD::CALLSEQ_END) { + if (Opcode != ISD::CALLSEQ_START && Opcode != ISD::CALLSEQ_END && + VT != MVT::Flag) { SDNode *&BON = BinaryOps[std::make_pair(Opcode, std::make_pair(N1, N2))]; if (BON) return SDOperand(BON, 0); @@ -1704,11 +1710,15 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, Ops.push_back(N2); Ops.push_back(N3); - // Memoize nodes. - SDNode *&N = OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; - if (N) return SDOperand(N, 0); - - N = new SDNode(Opcode, N1, N2, N3); + // Memoize node if it doesn't produce a flag. + SDNode *N; + if (VT != MVT::Flag) { + SDNode *&E = OneResultNodes[std::make_pair(Opcode,std::make_pair(VT, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, N1, N2, N3); + } else { + N = new SDNode(Opcode, N1, N2, N3); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1833,9 +1843,15 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, } // Memoize nodes. - SDNode *&N = OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Ops); + SDNode *N; + if (VT != MVT::Flag) { + SDNode *&E = + OneResultNodes[std::make_pair(Opcode, std::make_pair(VT, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, Ops); + } else { + N = new SDNode(Opcode, Ops); + } N->setValueTypes(VT); AllNodes.push_back(N); return SDOperand(N, 0); @@ -1888,11 +1904,16 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, #endif } - // Memoize the node. - SDNode *&N = ArbitraryNodes[std::make_pair(Opcode, std::make_pair(ResultTys, - Ops))]; - if (N) return SDOperand(N, 0); - N = new SDNode(Opcode, Ops); + // Memoize the node unless it returns a flag. + SDNode *N; + if (ResultTys.back() != MVT::Flag) { + SDNode *&E = + ArbitraryNodes[std::make_pair(Opcode, std::make_pair(ResultTys, Ops))]; + if (E) return SDOperand(E, 0); + E = N = new SDNode(Opcode, Ops); + } else { + N = new SDNode(Opcode, Ops); + } N->setValueTypes(ResultTys); AllNodes.push_back(N); return SDOperand(N, 0); |