Skip to content

Commit c0797f9

Browse files
committed
Factor out conversion of operands for binary_overflow_exprt
1 parent e884c43 commit c0797f9

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

src/solvers/flattening/boolbv_overflow.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,19 @@ Author: Daniel Kroening, kroening@kroening.com
1313

1414
literalt boolbvt::convert_binary_overflow(const binary_overflow_exprt &expr)
1515
{
16+
const bvt &bv0 = convert_bv(expr.lhs());
17+
const bvt &bv1 = convert_bv(
18+
expr.rhs(),
19+
can_cast_expr<mult_overflow_exprt>(expr)
20+
? optionalt<std::size_t>{bv0.size()}
21+
: nullopt);
22+
1623
const auto plus_or_minus_conversion =
1724
[&](
1825
const binary_overflow_exprt &overflow_expr,
1926
const std::function<literalt(
2027
bv_utilst *, const bvt &, const bvt &, bv_utilst::representationt)>
2128
&bv_util_overflow) {
22-
const bvt &bv0 = convert_bv(overflow_expr.lhs());
23-
const bvt &bv1 = convert_bv(overflow_expr.rhs());
2429

2530
if(bv0.size() != bv1.size())
2631
return SUB::convert_rest(expr);
@@ -49,9 +54,6 @@ literalt boolbvt::convert_binary_overflow(const binary_overflow_exprt &expr)
4954
mult_overflow->lhs().type().id() != ID_signedbv)
5055
return SUB::convert_rest(expr);
5156

52-
bvt bv0 = convert_bv(mult_overflow->lhs());
53-
bvt bv1 = convert_bv(mult_overflow->rhs(), bv0.size());
54-
5557
bv_utilst::representationt rep =
5658
mult_overflow->lhs().type().id() == ID_signedbv
5759
? bv_utilst::representationt::SIGNED
@@ -65,10 +67,10 @@ literalt boolbvt::convert_binary_overflow(const binary_overflow_exprt &expr)
6567
std::size_t new_size=old_size*2;
6668

6769
// sign/zero extension
68-
bv0=bv_utils.extension(bv0, new_size, rep);
69-
bv1=bv_utils.extension(bv1, new_size, rep);
70+
const bvt &bv0_extended = bv_utils.extension(bv0, new_size, rep);
71+
const bvt &bv1_extended = bv_utils.extension(bv1, new_size, rep);
7072

71-
bvt result=bv_utils.multiplier(bv0, bv1, rep);
73+
bvt result = bv_utils.multiplier(bv0_extended, bv1_extended, rep);
7274

7375
if(rep==bv_utilst::representationt::UNSIGNED)
7476
{
@@ -100,9 +102,6 @@ literalt boolbvt::convert_binary_overflow(const binary_overflow_exprt &expr)
100102
else if(
101103
const auto shl_overflow = expr_try_dynamic_cast<shl_overflow_exprt>(expr))
102104
{
103-
const bvt &bv0 = convert_bv(shl_overflow->lhs());
104-
const bvt &bv1 = convert_bv(shl_overflow->rhs());
105-
106105
std::size_t old_size = bv0.size();
107106
std::size_t new_size = old_size * 2;
108107

0 commit comments

Comments
 (0)