@@ -54,47 +54,47 @@ bool simplify_exprt::simplify_bswap(bswap_exprt &expr)
54
54
return true ;
55
55
}
56
56
57
- static bool sum_expr (exprt &dest, const exprt &expr)
57
+ // ! produce a sum of two constant expressions of the same type
58
+ // ! \return 'false' iff this was successful
59
+ static bool sum_expr (
60
+ constant_exprt &dest,
61
+ const constant_exprt &expr)
58
62
{
59
- if (!dest.is_constant () || !expr.is_constant ())
60
- return true ;
61
-
62
63
if (dest.type ()!=expr.type ())
63
64
return true ;
64
65
65
66
const irep_idt &type_id=dest.type ().id ();
66
67
67
68
if (type_id==ID_integer || type_id==ID_natural)
68
69
{
69
- dest.set (ID_value, integer2string (
70
- string2integer (dest.get_string (ID_value ))+
71
- string2integer (expr.get_string (ID_value ))));
70
+ dest.set_value ( integer2string (
71
+ string2integer (id2string ( dest.get_value () ))+
72
+ string2integer (id2string ( expr.get_value () ))));
72
73
return false ;
73
74
}
74
75
else if (type_id==ID_rational)
75
76
{
76
77
rationalt a, b;
77
78
if (!to_rational (dest, a) && !to_rational (expr, b))
78
79
{
79
- exprt a_plus_b=from_rational (a+b);
80
- dest.set (ID_value, a_plus_b.get_string (ID_value));
80
+ dest=from_rational (a+b);
81
81
return false ;
82
82
}
83
83
}
84
84
else if (type_id==ID_unsignedbv || type_id==ID_signedbv)
85
85
{
86
- dest.set (ID_value, integer2binary (
87
- binary2integer (dest.get_string (ID_value ), false )+
88
- binary2integer (expr.get_string (ID_value ), false ),
89
- unsafe_string2unsigned (dest.type (). get_string (ID_width) )));
86
+ dest.set_value ( integer2binary (
87
+ binary2integer (id2string ( dest.get_value () ), false )+
88
+ binary2integer (id2string ( expr.get_value () ), false ),
89
+ to_bitvector_type (dest.type ()). get_width ( )));
90
90
return false ;
91
91
}
92
92
else if (type_id==ID_fixedbv)
93
93
{
94
- dest.set (ID_value, integer2binary (
95
- binary2integer (dest.get_string (ID_value ), false )+
96
- binary2integer (expr.get_string (ID_value ), false ),
97
- unsafe_string2unsigned (dest.type (). get_string (ID_width) )));
94
+ dest.set_value ( integer2binary (
95
+ binary2integer (id2string ( dest.get_value () ), false )+
96
+ binary2integer (id2string ( expr.get_value () ), false ),
97
+ to_bitvector_type (dest.type ()). get_width ( )));
98
98
return false ;
99
99
}
100
100
else if (type_id==ID_floatbv)
@@ -108,40 +108,40 @@ static bool sum_expr(exprt &dest, const exprt &expr)
108
108
return true ;
109
109
}
110
110
111
- static bool mul_expr (exprt &dest, const exprt &expr)
111
+ // ! produce a product of two expressions of the same type
112
+ // ! \return 'false' iff this was successful
113
+ static bool mul_expr (
114
+ constant_exprt &dest,
115
+ const constant_exprt &expr)
112
116
{
113
- if (!dest.is_constant () || !expr.is_constant ())
114
- return true ;
115
-
116
117
if (dest.type ()!=expr.type ())
117
118
return true ;
118
119
119
120
const irep_idt &type_id=dest.type ().id ();
120
121
121
122
if (type_id==ID_integer || type_id==ID_natural)
122
123
{
123
- dest.set (ID_value, integer2string (
124
- string2integer (dest.get_string (ID_value ))*
125
- string2integer (expr.get_string (ID_value ))));
124
+ dest.set_value ( integer2string (
125
+ string2integer (id2string ( dest.get_value () ))*
126
+ string2integer (id2string ( expr.get_value () ))));
126
127
return false ;
127
128
}
128
129
else if (type_id==ID_rational)
129
130
{
130
131
rationalt a, b;
131
132
if (!to_rational (dest, a) && !to_rational (expr, b))
132
133
{
133
- exprt a_mul_b=from_rational (a*b);
134
- dest.set (ID_value, a_mul_b.get_string (ID_value));
134
+ dest=from_rational (a*b);
135
135
return false ;
136
136
}
137
137
}
138
138
else if (type_id==ID_unsignedbv || type_id==ID_signedbv)
139
139
{
140
140
// the following works for signed and unsigned integers
141
- dest.set (ID_value, integer2binary (
142
- binary2integer (dest.get_string (ID_value ), false )*
143
- binary2integer (expr.get_string (ID_value ), false ),
144
- unsafe_string2unsigned (dest.type (). get_string (ID_width) )));
141
+ dest.set_value ( integer2binary (
142
+ binary2integer (id2string ( dest.get_value () ), false )*
143
+ binary2integer (id2string ( expr.get_value () ), false ),
144
+ to_bitvector_type (dest.type ()). get_width ( )));
145
145
return false ;
146
146
}
147
147
else if (type_id==ID_fixedbv)
@@ -213,7 +213,7 @@ bool simplify_exprt::simplify_mult(exprt &expr)
213
213
if (found)
214
214
{
215
215
// update the constant factor
216
- if (!mul_expr (*constant, *it))
216
+ if (!mul_expr (to_constant_expr ( *constant), to_constant_expr ( *it) ))
217
217
do_erase=true ;
218
218
}
219
219
else
@@ -465,7 +465,7 @@ bool simplify_exprt::simplify_plus(exprt &expr)
465
465
it->is_constant () &&
466
466
next->is_constant ())
467
467
{
468
- sum_expr (*it, *next);
468
+ sum_expr (to_constant_expr ( *it), to_constant_expr ( *next) );
469
469
operands.erase (next);
470
470
}
471
471
}
@@ -517,7 +517,8 @@ bool simplify_exprt::simplify_plus(exprt &expr)
517
517
}
518
518
else
519
519
{
520
- if (!sum_expr (*const_sum, *it))
520
+ if (!sum_expr (to_constant_expr (*const_sum),
521
+ to_constant_expr (*it)))
521
522
{
522
523
*it=from_integer (0 , it->type ());
523
524
assert (it->is_not_nil ());
0 commit comments