mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 20:18:18 +00:00
bugfix for bv_size_reduction
Signed-off-by: Christoph M. Wintersteiger <cwinter@microsoft.com>
This commit is contained in:
parent
213d816c0a
commit
53cfa47214
|
@ -229,17 +229,35 @@ struct bv_size_reduction_tactic::imp {
|
||||||
else {
|
else {
|
||||||
// l < u
|
// l < u
|
||||||
if (l.is_neg()) {
|
if (l.is_neg()) {
|
||||||
unsigned i_nb = (u - l).get_num_bits() + 1;
|
unsigned l_nb = (-l).get_num_bits();
|
||||||
unsigned v_nb = m_util.get_bv_size(v);
|
unsigned v_nb = m_util.get_bv_size(v);
|
||||||
|
|
||||||
|
if (u.is_neg())
|
||||||
|
{
|
||||||
|
// l <= v <= u <= 0
|
||||||
|
unsigned i_nb = l_nb;
|
||||||
|
TRACE("bv_size_reduction", tout << " l <= " << v->get_decl()->get_name() << " <= u <= 0 " << " --> " << i_nb << " bits\n";);
|
||||||
|
if (i_nb < v_nb) {
|
||||||
|
new_const = m.mk_fresh_const(0, m_util.mk_sort(i_nb));
|
||||||
|
new_def = m_util.mk_concat(m_util.mk_numeral(numeral(-1), v_nb - i_nb), new_const);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// l <= v <= 0 <= u
|
||||||
|
unsigned u_nb = u.get_num_bits();
|
||||||
|
unsigned i_nb = ((l_nb > u_nb) ? l_nb : u_nb) + 1;
|
||||||
|
TRACE("bv_size_reduction", tout << " l <= " << v->get_decl()->get_name() << " <= 0 <= u " << " --> " << i_nb << " bits\n";);
|
||||||
if (i_nb < v_nb) {
|
if (i_nb < v_nb) {
|
||||||
new_const = m.mk_fresh_const(0, m_util.mk_sort(i_nb));
|
new_const = m.mk_fresh_const(0, m_util.mk_sort(i_nb));
|
||||||
new_def = m_util.mk_sign_extend(v_nb - i_nb, new_const);
|
new_def = m_util.mk_sign_extend(v_nb - i_nb, new_const);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// 0 <= l <= v <= u
|
// 0 <= l <= v <= u
|
||||||
unsigned u_nb = u.get_num_bits();
|
unsigned u_nb = u.get_num_bits();
|
||||||
unsigned v_nb = m_util.get_bv_size(v);
|
unsigned v_nb = m_util.get_bv_size(v);
|
||||||
|
TRACE("bv_size_reduction", tout << l << " <= " << v->get_decl()->get_name() << " <= " << u << " --> " << u_nb << " bits\n";);
|
||||||
if (u_nb < v_nb) {
|
if (u_nb < v_nb) {
|
||||||
new_const = m.mk_fresh_const(0, m_util.mk_sort(u_nb));
|
new_const = m.mk_fresh_const(0, m_util.mk_sort(u_nb));
|
||||||
new_def = m_util.mk_concat(m_util.mk_numeral(numeral(0), v_nb - u_nb), new_const);
|
new_def = m_util.mk_concat(m_util.mk_numeral(numeral(0), v_nb - u_nb), new_const);
|
||||||
|
|
Loading…
Reference in a new issue