diff --git a/src/ast/rewriter/bool_rewriter.cpp b/src/ast/rewriter/bool_rewriter.cpp index e5d5f9110..0bfdfa01a 100644 --- a/src/ast/rewriter/bool_rewriter.cpp +++ b/src/ast/rewriter/bool_rewriter.cpp @@ -729,6 +729,8 @@ br_status bool_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { return BR_REWRITE1; if (m_ite_extra_rules) { + expr* c1, * t1, * e1; + expr* c2, * t2, * e2; if (m().is_ite(lhs) && m().is_value(rhs)) { r = try_ite_value(to_app(lhs), to_app(rhs), result); CTRACE("try_ite_value", r != BR_FAILED, @@ -739,6 +741,16 @@ br_status bool_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { CTRACE("try_ite_value", r != BR_FAILED, tout << mk_bounded_pp(lhs, m()) << "\n" << mk_bounded_pp(rhs, m()) << "\n--->\n" << mk_bounded_pp(result, m()) << "\n";); } + else if (m().is_ite(lhs, c1, t1, e1) && m().is_ite(rhs, c2, t2, e2) && + m().is_value(t1) && m().is_value(e1) && m().is_value(t2) && m().is_value(e2)) { + expr_ref_vector args(m()); + args.push_back(m().mk_or(c1, c2, m().mk_eq(e1, e2))); + args.push_back(m().mk_or(m().mk_not(c1), m().mk_not(c2), m().mk_eq(t1, t2))); + args.push_back(m().mk_or(m().mk_not(c1), c2, m().mk_eq(t1, e2))); + args.push_back(m().mk_or(c1, m().mk_not(c2), m().mk_eq(e1, t2))); + result = m().mk_and(args); + return BR_REWRITE_FULL; + } if (r != BR_FAILED) return r; } diff --git a/src/ast/rewriter/bv_rewriter.cpp b/src/ast/rewriter/bv_rewriter.cpp index 295ef6443..0f73c7c89 100644 --- a/src/ast/rewriter/bv_rewriter.cpp +++ b/src/ast/rewriter/bv_rewriter.cpp @@ -2934,6 +2934,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) { return BR_DONE; } + return BR_FAILED; } diff --git a/src/ast/sls/sls_bv_lookahead.cpp b/src/ast/sls/sls_bv_lookahead.cpp index 0e63fc727..4198b949b 100644 --- a/src/ast/sls/sls_bv_lookahead.cpp +++ b/src/ast/sls/sls_bv_lookahead.cpp @@ -553,8 +553,11 @@ namespace sls { continue; if (ctx.is_true(v) == v1) continue; + unsigned num_unsat = ctx.unsat().size(); TRACE("bv", tout << "update flip " << mk_bounded_pp(e, m) << "\n";); ctx.flip(v); + if (num_unsat < ctx.unsat().size()) + ctx.flip(v); } m_ev.set_bool_value(to_app(e), v1); }