@@ -13,14 +13,19 @@ Author: Daniel Kroening, kroening@kroening.com
1313
1414literalt 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