mirror of
https://github.com/Z3Prover/z3
synced 2025-08-25 04:26:00 +00:00
h
- avoid more platform specific behavior when using m_mk_extract, - rename mk_eq in bool_rewriter to mk_eq_plain to distinguish it from mk_eq_rw - rework bv_lookahead to be more closely based on sls_engine, which has much better heuristic behavior than attempt 1.
This commit is contained in:
parent
a5bc5ed813
commit
f41134d1b6
17 changed files with 506 additions and 257 deletions
|
@ -671,12 +671,12 @@ br_status bool_rewriter::try_ite_value(app * ite, app * val, expr_ref & result)
|
|||
expr* cond2 = nullptr, *t2 = nullptr, *e2 = nullptr;
|
||||
if (m().is_ite(t, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2) &&
|
||||
BR_FAILED != try_ite_value(to_app(t), val, result)) {
|
||||
result = m().mk_ite(cond, result, mk_eq(e, val));
|
||||
result = m().mk_ite(cond, result, mk_eq_plain(e, val));
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
if (m().is_ite(e, cond2, t2, e2) && m().is_value(t2) && m().is_value(e2) &&
|
||||
BR_FAILED != try_ite_value(to_app(e), val, result)) {
|
||||
result = m().mk_ite(cond, mk_eq(t, val), result);
|
||||
result = m().mk_ite(cond, mk_eq_plain(t, val), result);
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
||||
|
@ -684,11 +684,15 @@ br_status bool_rewriter::try_ite_value(app * ite, app * val, expr_ref & result)
|
|||
}
|
||||
|
||||
|
||||
app* bool_rewriter::mk_eq(expr* lhs, expr* rhs) {
|
||||
app* bool_rewriter::mk_eq_plain(expr* lhs, expr* rhs) {
|
||||
if (m().are_equal(lhs, rhs))
|
||||
return m().mk_true();
|
||||
if (m().are_distinct(lhs, rhs))
|
||||
return m().mk_false();
|
||||
if (m().is_false(rhs)) {
|
||||
verbose_stream() << "here\n";
|
||||
}
|
||||
VERIFY(!m().is_false(rhs));
|
||||
return m().mk_eq(lhs, rhs);
|
||||
}
|
||||
|
||||
|
@ -775,7 +779,8 @@ br_status bool_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) {
|
|||
std::swap(lhs, rhs);
|
||||
|
||||
if (m().is_not(lhs, lhs)) {
|
||||
result = m().mk_not(m().mk_eq(lhs, rhs));
|
||||
mk_eq(lhs, rhs, result);
|
||||
mk_not(result, result);
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
||||
|
|
|
@ -135,11 +135,11 @@ public:
|
|||
br_status mk_ite_core(expr * c, expr * t, expr * e, expr_ref & result);
|
||||
br_status mk_not_core(expr * t, expr_ref & result);
|
||||
|
||||
app* mk_eq(expr* lhs, expr* rhs);
|
||||
app* mk_eq_plain(expr* lhs, expr* rhs);
|
||||
|
||||
void mk_eq(expr * lhs, expr * rhs, expr_ref & result) {
|
||||
if (mk_eq_core(lhs, rhs, result) == BR_FAILED)
|
||||
result = mk_eq(lhs, rhs);
|
||||
result = mk_eq_plain(lhs, rhs);
|
||||
}
|
||||
expr_ref mk_eq_rw(expr* lhs, expr* rhs) {
|
||||
expr_ref r(m()), _lhs(lhs, m()), _rhs(rhs, m());
|
||||
|
|
|
@ -640,8 +640,13 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref
|
|||
// use the equivalence to simplify:
|
||||
// #x000f <=_u b <=> b[sz-1:lnz+1] != 0 or #xf <= b[lnz:0])
|
||||
|
||||
result = m.mk_implies(m.mk_eq(m_mk_extract(bv_sz - 1, lnz + 1, b), mk_zero(bv_sz - lnz - 1)),
|
||||
m_util.mk_ule(m_mk_extract(lnz, 0, a), m_mk_extract(lnz, 0, b)));
|
||||
expr_ref e1(m_mk_extract(bv_sz - 1, lnz + 1, b), m);
|
||||
expr_ref e2(mk_zero(bv_sz - lnz - 1), m);
|
||||
e1 = m.mk_eq(e1, e2);
|
||||
expr_ref e3(m_mk_extract(lnz, 0, a), m);
|
||||
expr_ref e4(m_mk_extract(lnz, 0, b), m);
|
||||
e2 = m_util.mk_ule(e3, e4);
|
||||
result = m.mk_implies(e1, e2);
|
||||
return BR_REWRITE_FULL;
|
||||
}
|
||||
}
|
||||
|
@ -866,6 +871,13 @@ br_status bv_rewriter::mk_extract(unsigned high, unsigned low, expr * arg, expr_
|
|||
return BR_REWRITE2;
|
||||
}
|
||||
|
||||
// [....][xx] -> [yy][....] hi <= |[....]| then can extract [hi + k:lo + k]
|
||||
// (ashr t k)[hi:0] -> t[hi+k:k]
|
||||
if (low == 0 && m_util.is_bv_ashr(arg, t, c) && m_util.is_numeral(c, v, sz) && high < sz - v) {
|
||||
result = m_mk_extract(high + v.get_unsigned(), low + v.get_unsigned(), t);
|
||||
return BR_REWRITE1;
|
||||
}
|
||||
|
||||
return BR_FAILED;
|
||||
}
|
||||
|
||||
|
@ -2498,8 +2510,8 @@ br_status bv_rewriter::mk_bit2bool(expr * lhs, expr * rhs, expr_ref & result) {
|
|||
expr* a = nullptr, *b = nullptr, *c = nullptr;
|
||||
if (m.is_ite(lhs, a, b, c)) {
|
||||
bool_rewriter rw(m);
|
||||
expr_ref e1(rw.mk_eq(b, rhs), m);
|
||||
expr_ref e2(rw.mk_eq(c, rhs), m);
|
||||
expr_ref e1(rw.mk_eq_rw(b, rhs), m);
|
||||
expr_ref e2(rw.mk_eq_rw(c, rhs), m);
|
||||
result = rw.mk_ite(a, e1, e2);
|
||||
return BR_REWRITE2;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue