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);  | 
