Skip to content

Commit f859063

Browse files
fix #4164
1 parent 5b6255e commit f859063

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

src/ast/rewriter/poly_rewriter_def.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,10 @@ bool poly_rewriter<Config>::hoist_ite(expr_ref& e) {
980980
++i;
981981
}
982982
if (!pinned.empty()) {
983+
std::cout << "hoist: " << e << "\n";
983984
e = mk_add_app(adds.size(), adds.c_ptr());
985+
std::cout << "hoisted: " << e << "\n";
986+
984987
return true;
985988
}
986989
return false;
@@ -997,7 +1000,7 @@ bool poly_rewriter<Config>::hoist_ite(expr* a, obj_hashtable<expr>& shared, nume
9971000
return false;
9981001
}
9991002
ptr_buffer<expr> adds;
1000-
TO_BUFFER(is_add, adds, a);
1003+
TO_BUFFER(is_add, adds, a);
10011004
if (g.is_zero()) { // first
10021005
for (expr* e : adds) {
10031006
shared.insert(e);
@@ -1010,8 +1013,18 @@ bool poly_rewriter<Config>::hoist_ite(expr* a, obj_hashtable<expr>& shared, nume
10101013
}
10111014
set_intersection<obj_hashtable<expr>, obj_hashtable<expr>>(shared, tmp);
10121015
}
1016+
if (shared.empty())
1017+
return false;
1018+
// ensure that expression occur uniquely, otherwise
1019+
// using the shared hash-table is unsound.
1020+
ast_mark is_marked;
1021+
for (expr* e : adds) {
1022+
if (is_marked.is_marked(e))
1023+
return false;
1024+
is_marked.mark(e, true);
1025+
}
10131026
g = numeral(1);
1014-
return !shared.empty();
1027+
return true;
10151028
}
10161029

10171030
template<typename Config>

0 commit comments

Comments
 (0)