Skip to content

Commit d66609e

Browse files
fix #7389
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
1 parent 0c48a50 commit d66609e

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/ast/rewriter/bv_rewriter.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,31 @@ br_status bv_rewriter::mk_leq_core(bool is_signed, expr * a, expr * b, expr_ref
618618
return BR_REWRITE3;
619619
}
620620

621+
// #x000f <=_u a <=> not (a <=_u #x000f) or a = #x000f
622+
i = bv_sz;
623+
first_non_zero = UINT_MAX;
624+
while (i > 0) {
625+
--i;
626+
if (!is_zero_bit(a, i)) {
627+
first_non_zero = i;
628+
break;
629+
}
630+
}
631+
632+
if (first_non_zero == UINT_MAX) {
633+
// all bits are zero
634+
result = m.mk_eq(b, mk_zero(bv_sz));
635+
return BR_REWRITE1;
636+
}
637+
else if (first_non_zero < bv_sz - 1 && m_le2extract) {
638+
result = m.mk_and(m.mk_eq(m_mk_extract(bv_sz - 1, first_non_zero + 1, b), mk_zero(bv_sz - first_non_zero - 1)),
639+
m_util.mk_ule(m_mk_extract(first_non_zero, 0, b), m_mk_extract(first_non_zero, 0, a)));
640+
result = m.mk_or(m.mk_not(result), m.mk_eq(a, b));
641+
return BR_REWRITE_FULL;
642+
}
643+
644+
645+
621646
}
622647
#endif
623648

0 commit comments

Comments
 (0)