@@ -1445,19 +1445,50 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e
14451445br_status bv_rewriter::mk_int2bv (unsigned bv_size, expr * arg, expr_ref & result) {
14461446 numeral val;
14471447 bool is_int;
1448-
1448+ expr* x;
14491449 if (m_autil.is_numeral (arg, val, is_int)) {
14501450 val = m_util.norm (val, bv_size);
14511451 result = mk_numeral (val, bv_size);
14521452 return BR_DONE;
14531453 }
14541454
1455- // ( int2bv (bv2int x) ) --> x
1456- if (m_util.is_bv2int (arg) && bv_size == get_bv_size (to_app (arg)-> get_arg ( 0 ) )) {
1457- result = to_app (arg)-> get_arg ( 0 ) ;
1455+ // int2bv (bv2int x) --> x
1456+ if (m_util.is_bv2int (arg, x ) && bv_size == get_bv_size (x )) {
1457+ result = x ;
14581458 return BR_DONE;
14591459 }
14601460
1461+ // int2bv (bv2int x) --> 0000x
1462+ if (m_util.is_bv2int (arg, x) && bv_size > get_bv_size (x)) {
1463+ mk_zero_extend (bv_size - get_bv_size (x), x, result);
1464+ return BR_REWRITE1;
1465+ }
1466+
1467+ // int2bv (bv2int x) --> x[sz-1:0]
1468+ if (m_util.is_bv2int (arg, x) && bv_size < get_bv_size (x)) {
1469+ result = m_mk_extract (bv_size - 1 , 0 , x);
1470+ return BR_REWRITE1;
1471+ }
1472+
1473+ #if 0
1474+ // int2bv (a + b) --> int2bv(a) + int2bv(b)
1475+ if (m_autil.is_add(arg)) {
1476+ expr_ref_vector args(m);
1477+ for (expr* e : *to_app(arg))
1478+ args.push_back(m_util.mk_int2bv(bv_size, e));
1479+ result = m_util.mk_bv_add(args);
1480+ return BR_REWRITE3;
1481+ }
1482+ // int2bv (a * b) --> int2bv(a) * int2bv(b)
1483+ if (m_autil.is_mul(arg)) {
1484+ expr_ref_vector args(m);
1485+ for (expr* e : *to_app(arg))
1486+ args.push_back(m_util.mk_int2bv(bv_size, e));
1487+ result = m_util.mk_bv_mul(args);
1488+ return BR_REWRITE3;
1489+ }
1490+ #endif
1491+
14611492 return BR_FAILED;
14621493}
14631494
@@ -2740,6 +2771,27 @@ bool bv_rewriter::is_urem_any(expr * e, expr * & dividend, expr * & divisor) {
27402771 return true ;
27412772}
27422773
2774+ br_status bv_rewriter::mk_eq_bv2int (expr* lhs, expr* rhs, expr_ref& result) {
2775+ rational r;
2776+ expr* x, *y;
2777+ if (m_autil.is_numeral (lhs))
2778+ std::swap (lhs, rhs);
2779+
2780+ if (m_autil.is_numeral (rhs, r) && m_util.is_bv2int (lhs, x)) {
2781+ unsigned bv_size = m_util.get_bv_size (x);
2782+ if (0 <= r && r < rational::power_of_two (bv_size))
2783+ result = m.mk_eq (m_util.mk_numeral (r, bv_size), x);
2784+ else
2785+ result = m.mk_false ();
2786+ return BR_REWRITE1;
2787+ }
2788+ if (m_util.is_bv2int (lhs, x) && m_util.is_bv2int (rhs, y)) {
2789+ result = m.mk_eq (x, y);
2790+ return BR_REWRITE1;
2791+ }
2792+ return BR_FAILED;
2793+ }
2794+
27432795br_status bv_rewriter::mk_eq_core (expr * lhs, expr * rhs, expr_ref & result) {
27442796 if (lhs == rhs) {
27452797 result = m.mk_true ();
@@ -2783,6 +2835,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) {
27832835 return st;
27842836 }
27852837
2838+
27862839 if (m_blast_eq_value) {
27872840 st = mk_blast_eq_value (lhs, rhs, result);
27882841 if (st != BR_FAILED)
0 commit comments