@@ -1445,19 +1445,50 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e
1445
1445
br_status bv_rewriter::mk_int2bv (unsigned bv_size, expr * arg, expr_ref & result) {
1446
1446
numeral val;
1447
1447
bool is_int;
1448
-
1448
+ expr* x;
1449
1449
if (m_autil.is_numeral (arg, val, is_int)) {
1450
1450
val = m_util.norm (val, bv_size);
1451
1451
result = mk_numeral (val, bv_size);
1452
1452
return BR_DONE;
1453
1453
}
1454
1454
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 ;
1458
1458
return BR_DONE;
1459
1459
}
1460
1460
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
+
1461
1492
return BR_FAILED;
1462
1493
}
1463
1494
@@ -2740,6 +2771,27 @@ bool bv_rewriter::is_urem_any(expr * e, expr * & dividend, expr * & divisor) {
2740
2771
return true ;
2741
2772
}
2742
2773
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
+
2743
2795
br_status bv_rewriter::mk_eq_core (expr * lhs, expr * rhs, expr_ref & result) {
2744
2796
if (lhs == rhs) {
2745
2797
result = m.mk_true ();
@@ -2783,6 +2835,7 @@ br_status bv_rewriter::mk_eq_core(expr * lhs, expr * rhs, expr_ref & result) {
2783
2835
return st;
2784
2836
}
2785
2837
2838
+
2786
2839
if (m_blast_eq_value) {
2787
2840
st = mk_blast_eq_value (lhs, rhs, result);
2788
2841
if (st != BR_FAILED)
0 commit comments