Skip to content

Commit 6acae33

Browse files
authored
Merge pull request #3098 from diffblue/sum-cleanup
simplifier: sum and mul cleanup
2 parents 9435312 + b7caa0a commit 6acae33

File tree

2 files changed

+35
-33
lines changed

2 files changed

+35
-33
lines changed

src/util/fixedbv.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,18 @@ fixedbvt &fixedbvt::operator*=(const fixedbvt &o)
106106
return *this;
107107
}
108108

109+
fixedbvt &fixedbvt::operator+=(const fixedbvt &o)
110+
{
111+
v += o.v;
112+
return *this;
113+
}
114+
115+
fixedbvt &fixedbvt::operator-=(const fixedbvt &o)
116+
{
117+
v -= o.v;
118+
return *this;
119+
}
120+
109121
fixedbvt &fixedbvt::operator/=(const fixedbvt &o)
110122
{
111123
v*=power(2, o.spec.get_fraction_bits());

src/util/simplify_expr_int.cpp

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,16 @@ static bool sum_expr(
7070

7171
const irep_idt &type_id=dest.type().id();
7272

73-
if(type_id==ID_integer || type_id==ID_natural)
73+
if(
74+
type_id == ID_integer || type_id == ID_natural ||
75+
type_id == ID_unsignedbv || type_id == ID_signedbv)
7476
{
75-
dest.set_value(integer2string(
76-
string2integer(id2string(dest.get_value()))+
77-
string2integer(id2string(expr.get_value()))));
78-
return false;
77+
mp_integer a, b;
78+
if(!to_integer(dest, a) && !to_integer(expr, b))
79+
{
80+
dest = from_integer(a + b, dest.type());
81+
return false;
82+
}
7983
}
8084
else if(type_id==ID_rational)
8185
{
@@ -86,26 +90,17 @@ static bool sum_expr(
8690
return false;
8791
}
8892
}
89-
else if(type_id==ID_unsignedbv || type_id==ID_signedbv)
90-
{
91-
dest.set_value(integer2binary(
92-
binary2integer(id2string(dest.get_value()), false)+
93-
binary2integer(id2string(expr.get_value()), false),
94-
to_bitvector_type(dest.type()).get_width()));
95-
return false;
96-
}
9793
else if(type_id==ID_fixedbv)
9894
{
99-
dest.set_value(integer2binary(
100-
binary2integer(id2string(dest.get_value()), false)+
101-
binary2integer(id2string(expr.get_value()), false),
102-
to_bitvector_type(dest.type()).get_width()));
95+
fixedbvt f(dest);
96+
f += fixedbvt(expr);
97+
dest = f.to_expr();
10398
return false;
10499
}
105100
else if(type_id==ID_floatbv)
106101
{
107-
ieee_floatt f(to_constant_expr(dest));
108-
f+=ieee_floatt(to_constant_expr(expr));
102+
ieee_floatt f(dest);
103+
f += ieee_floatt(expr);
109104
dest=f.to_expr();
110105
return false;
111106
}
@@ -124,12 +119,16 @@ static bool mul_expr(
124119

125120
const irep_idt &type_id=dest.type().id();
126121

127-
if(type_id==ID_integer || type_id==ID_natural)
122+
if(
123+
type_id == ID_integer || type_id == ID_natural ||
124+
type_id == ID_unsignedbv || type_id == ID_signedbv)
128125
{
129-
dest.set_value(integer2string(
130-
string2integer(id2string(dest.get_value()))*
131-
string2integer(id2string(expr.get_value()))));
132-
return false;
126+
mp_integer a, b;
127+
if(!to_integer(dest, a) && !to_integer(expr, b))
128+
{
129+
dest = from_integer(a * b, dest.type());
130+
return false;
131+
}
133132
}
134133
else if(type_id==ID_rational)
135134
{
@@ -140,15 +139,6 @@ static bool mul_expr(
140139
return false;
141140
}
142141
}
143-
else if(type_id==ID_unsignedbv || type_id==ID_signedbv)
144-
{
145-
// the following works for signed and unsigned integers
146-
dest.set_value(integer2binary(
147-
binary2integer(id2string(dest.get_value()), false)*
148-
binary2integer(id2string(expr.get_value()), false),
149-
to_bitvector_type(dest.type()).get_width()));
150-
return false;
151-
}
152142
else if(type_id==ID_fixedbv)
153143
{
154144
fixedbvt f(to_constant_expr(dest));

0 commit comments

Comments
 (0)