mirror of
https://github.com/Z3Prover/z3
synced 2025-11-10 08:02:01 +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
|
|
@ -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