From eca82ddc05ff6e81592f7cceec60b0d3269bab5c Mon Sep 17 00:00:00 2001 From: Morgan Deters Date: Tue, 5 Apr 2011 18:31:38 +0000 Subject: [PATCH] Memory fix for congruence closure; affects many UF benchmarks, probably AX too. --- src/util/congruence_closure.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/util/congruence_closure.h b/src/util/congruence_closure.h index 9b1b022fa..83f6d15c0 100644 --- a/src/util/congruence_closure.h +++ b/src/util/congruence_closure.h @@ -146,7 +146,7 @@ class CongruenceClosure { typedef context::CDMap UseLists; typedef context::CDMap LookupMap; - typedef context::CDMap EqMap; + typedef __gnu_cxx::hash_map EqMap; typedef context::CDMap ProofMap; typedef context::CDMap ProofLabel; @@ -164,6 +164,7 @@ class CongruenceClosure { LookupMap d_lookup; EqMap d_eqMap; + context::CDSet d_added; ProofMap d_proof; ProofLabel d_proofLabel; @@ -203,7 +204,7 @@ public: d_classList(ctxt), d_useList(ctxt), d_lookup(ctxt), - d_eqMap(ctxt), + d_added(ctxt), d_proof(ctxt), d_proofLabel(ctxt), d_proofRewrite(ctxt), @@ -270,10 +271,16 @@ private: ++d_newSkolemVars; Node v = NodeManager::currentNM()->mkSkolem(t.getType()); addEq(NodeManager::currentNM()->mkNode(t.getType().isBoolean() ? kind::IFF : kind::EQUAL, t, v), TNode::null()); - d_eqMap.insert(t, v); + d_added.insert(v); + d_eqMap[t] = v; return v; } else { - return (*i).second; + TNode v = (*i).second; + if(!d_added.contains(v)) { + addEq(NodeManager::currentNM()->mkNode(t.getType().isBoolean() ? kind::IFF : kind::EQUAL, t, v), TNode::null()); + d_added.insert(v); + } + return v; } } else { return t; -- 2.30.2