Skip to content

Commit ba5cec7

Browse files
additional rewrites for bv2int
1 parent fa7fc8e commit ba5cec7

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

src/ast/rewriter/bv_rewriter.cpp

+57-4
Original file line numberDiff line numberDiff line change
@@ -1445,19 +1445,50 @@ br_status bv_rewriter::mk_bv_smod_core(expr * arg1, expr * arg2, bool hi_div0, e
14451445
br_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+
27432795
br_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)

src/ast/rewriter/bv_rewriter.h

+1
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ class bv_rewriter : public poly_rewriter<bv_rewriter_core> {
203203

204204
bool is_urem_any(expr * e, expr * & dividend, expr * & divisor);
205205
br_status mk_eq_core(expr * lhs, expr * rhs, expr_ref & result);
206+
br_status mk_eq_bv2int(expr* lhs, expr* rhs, expr_ref& result);
206207
br_status mk_ite_core(expr * c, expr * t, expr * e, expr_ref & result);
207208
br_status mk_distinct(unsigned num_args, expr * const * args, expr_ref & result);
208209

src/ast/rewriter/th_rewriter.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -685,9 +685,18 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
685685
st = m_seq_rw.mk_eq_core(a, b, result);
686686
if (st != BR_FAILED)
687687
return st;
688+
st = extended_bv_eq(a, b, result);
689+
if (st != BR_FAILED)
690+
return st;
688691
return apply_tamagotchi(a, b, result);
689692
}
690693

694+
br_status extended_bv_eq(expr* a, expr* b, expr_ref& result) {
695+
if (m_bv_util.is_bv2int(a) || m_bv_util.is_bv2int(b))
696+
return m_bv_rw.mk_eq_bv2int(a, b, result);
697+
return BR_FAILED;
698+
}
699+
691700
expr_ref mk_eq(expr* a, expr* b) {
692701
expr_ref result(m());
693702
br_status st = reduce_eq(a, b, result);

0 commit comments

Comments
 (0)