3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-18 02:16:40 +00:00

disable ternary, fixes to propagation, make bv_rewrites for multiplier n-ary

This commit is contained in:
Nikolaj Bjorner 2022-10-26 23:43:17 -07:00
parent 5352a0106d
commit fe1b4bf5ce
12 changed files with 159 additions and 75 deletions

View file

@ -2251,11 +2251,49 @@ bool bv_rewriter::is_zero_bit(expr * x, unsigned idx) {
return false;
}
br_status bv_rewriter::mk_mul_hoist(unsigned num_args, expr * const * args, expr_ref & result) {
if (num_args <= 1)
return BR_FAILED;
expr* z = nullptr, *u = nullptr;
for (unsigned i = 0; i < num_args; ++i) {
// ~x = -1 - x
if (m_util.is_bv_not(args[i], z)) {
unsigned sz = m_util.get_bv_size(z);
ptr_vector<expr> new_args(num_args, args);
rational p = rational(2).expt(sz) - 1;
new_args[i] = m_util.mk_bv_sub(mk_numeral(p, sz), z);
result = m_util.mk_bv_mul(num_args, new_args.data());
return BR_REWRITE3;
}
// shl(z, u) * x = shl(x * z, u)
if (m_util.is_bv_shl(args[i], z, u)) {
ptr_vector<expr> new_args(num_args, args);
new_args[i] = z;
result = m_util.mk_bv_mul(num_args, new_args.data());
result = m_util.mk_bv_shl(result, u);
return BR_REWRITE2;
}
}
return BR_FAILED;
}
br_status bv_rewriter::mk_bv_mul(unsigned num_args, expr * const * args, expr_ref & result) {
br_status st = mk_mul_core(num_args, args, result);
if (st != BR_FAILED && st != BR_DONE)
return st;
expr* x, * y, * z, * u;
if (st == BR_DONE && is_mul(result)) {
st = mk_mul_hoist(to_app(result)->get_num_args(), to_app(result)->get_args(), result);
if (st != BR_FAILED)
return st;
st = BR_DONE;
}
if (st == BR_FAILED) {
st = mk_mul_hoist(num_args, args, result);
if (st != BR_FAILED)
return st;
}
expr* x, * y;
if (st == BR_FAILED && num_args == 2) {
x = args[0];
y = args[1];
@ -2267,27 +2305,6 @@ br_status bv_rewriter::mk_bv_mul(unsigned num_args, expr * const * args, expr_re
else {
return st;
}
// ~x = -1 - x
unsigned sz = m_util.get_bv_size(x);
if (m_util.is_bv_not(x, z)) {
numeral p = rational(2).expt(sz) - 1;
result = m_util.mk_bv_mul(m_util.mk_bv_sub(mk_numeral(p, sz), z), y);
return BR_REWRITE3;
}
if (m_util.is_bv_not(y, z)) {
numeral p = rational(2).expt(sz) - 1;
result = m_util.mk_bv_mul(m_util.mk_bv_sub(mk_numeral(p, sz), z), x);
return BR_REWRITE3;
}
// shl(z, u) * x = shl(x * z, u)
if (m_util.is_bv_shl(x, z, u)) {
result = m_util.mk_bv_shl(m_util.mk_bv_mul(z, y), u);
return BR_REWRITE2;
}
if (m_util.is_bv_shl(y, z, u)) {
result = m_util.mk_bv_shl(m_util.mk_bv_mul(z, x), u);
return BR_REWRITE2;
}
if (m_mul2concat) {
numeral v;
unsigned bv_size;