Skip to content

Commit 972a993

Browse files
authored
Merge pull request #5764 from tautschnig/simplify-recursive-cleanup
Refine recursive calls within the simplifier
2 parents a719ea3 + af08918 commit 972a993

7 files changed

+61
-86
lines changed

src/util/simplify_expr.cpp

+23-22
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,8 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
795795
auto one = from_integer(1, expr_type);
796796
auto zero = from_integer(0, expr_type);
797797
exprt new_expr = if_exprt(expr.op(), std::move(one), std::move(zero));
798-
return changed(simplify_rec(new_expr)); // recursive call
798+
simplify_if_preorder(to_if_expr(new_expr));
799+
return new_expr;
799800
}
800801

801802
// circular casts through types shorter than `int`
@@ -884,16 +885,17 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
884885
if(sub_size.has_value())
885886
{
886887
auto new_expr = expr;
888+
exprt offset_expr =
889+
simplify_typecast(typecast_exprt(op_plus_expr.op1(), size_type()));
887890

888891
// void*
889892
if(*sub_size == 0 || *sub_size == 1)
890-
new_expr.op() = typecast_exprt(op_plus_expr.op1(), size_type());
893+
new_expr.op() = offset_expr;
891894
else
892-
new_expr.op() = mult_exprt(
893-
from_integer(*sub_size, size_type()),
894-
typecast_exprt(op_plus_expr.op1(), size_type()));
895-
896-
new_expr.op() = simplify_rec(new_expr.op()); // rec. call
895+
{
896+
new_expr.op() = simplify_mult(
897+
mult_exprt(from_integer(*sub_size, size_type()), offset_expr));
898+
}
897899

898900
return changed(simplify_typecast(new_expr)); // rec. call
899901
}
@@ -965,19 +967,18 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
965967

966968
for(auto &op : new_expr.op().operands())
967969
{
968-
if(op.type().id()==ID_pointer)
970+
exprt new_op = simplify_typecast(typecast_exprt(op, size_t_type));
971+
if(op.type().id() != ID_pointer && *step > 1)
969972
{
970-
op = typecast_exprt(op, size_t_type);
971-
}
972-
else
973-
{
974-
op = typecast_exprt(op, size_t_type);
975-
if(*step > 1)
976-
op = mult_exprt(from_integer(*step, size_t_type), op);
973+
new_op =
974+
simplify_mult(mult_exprt(from_integer(*step, size_t_type), new_op));
977975
}
976+
op = std::move(new_op);
978977
}
979978

980-
return changed(simplify_rec(new_expr)); // recursive call
979+
new_expr.op() = simplify_plus(to_plus_expr(new_expr.op()));
980+
981+
return changed(simplify_typecast(new_expr)); // recursive call
981982
}
982983
}
983984

@@ -1316,7 +1317,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
13161317
auto result =
13171318
address_of_exprt(index_exprt(o, from_integer(0, size_type())));
13181319

1319-
return changed(simplify_rec(result)); // recursive call
1320+
return changed(simplify_address_of(result)); // recursive call
13201321
}
13211322
}
13221323

@@ -1723,9 +1724,9 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
17231724
pointer_offset_bits(to_array_of_expr(expr.op()).what().type(), ns))
17241725
{
17251726
auto tmp = expr;
1726-
tmp.op() = index_exprt(expr.op(), expr.offset());
1727+
tmp.op() = simplify_index(index_exprt(expr.op(), expr.offset()));
17271728
tmp.offset() = from_integer(0, expr.offset().type());
1728-
return changed(simplify_rec(tmp));
1729+
return changed(simplify_byte_extract(tmp));
17291730
}
17301731

17311732
// extract bits of a constant
@@ -1970,19 +1971,19 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19701971
{
19711972
const exprt &index=with.where();
19721973
exprt index_offset =
1973-
simplify_node(mult_exprt(index, from_integer(*i, index.type())));
1974+
simplify_mult(mult_exprt(index, from_integer(*i, index.type())));
19741975

19751976
// index_offset may need a typecast
19761977
if(offset.type() != index.type())
19771978
{
19781979
index_offset =
1979-
simplify_node(typecast_exprt(index_offset, offset.type()));
1980+
simplify_typecast(typecast_exprt(index_offset, offset.type()));
19801981
}
19811982

19821983
plus_exprt new_offset(offset, index_offset);
19831984
exprt new_value(with.new_value());
19841985
auto tmp = expr;
1985-
tmp.set_offset(simplify_node(std::move(new_offset)));
1986+
tmp.set_offset(simplify_plus(std::move(new_offset)));
19861987
tmp.set_value(std::move(new_value));
19871988
return changed(simplify_byte_update(tmp)); // recursive call
19881989
}

src/util/simplify_expr_array.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,16 @@ simplify_exprt::simplify_index(const index_exprt &expr)
183183
return unchanged(expr);
184184

185185
// add offset to index
186-
mult_exprt offset(
187-
from_integer(*sub_size, byte_extract_expr.offset().type()), index);
186+
exprt offset = simplify_mult(mult_exprt{
187+
from_integer(*sub_size, byte_extract_expr.offset().type()), index});
188188
exprt final_offset =
189-
simplify_node(plus_exprt(byte_extract_expr.offset(), offset));
189+
simplify_plus(plus_exprt(byte_extract_expr.offset(), offset));
190190

191-
exprt result_expr(array.id(), expr.type());
192-
result_expr.add_to_operands(byte_extract_expr.op(), final_offset);
191+
auto result_expr = byte_extract_expr;
192+
result_expr.type() = expr.type();
193+
result_expr.offset() = final_offset;
193194

194-
return changed(simplify_rec(result_expr));
195+
return changed(simplify_byte_extract(result_expr));
195196
}
196197
}
197198
else if(array.id()==ID_if)

src/util/simplify_expr_boolean.cpp

+5-9
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ simplify_exprt::resultt<> simplify_exprt::simplify_boolean(const exprt &expr)
3838
binary_exprt new_expr = implies_expr;
3939
new_expr.id(ID_or);
4040
new_expr.op0() = simplify_not(not_exprt(new_expr.op0()));
41-
return changed(simplify_node(new_expr));
41+
return changed(simplify_boolean(new_expr));
4242
}
4343
else if(expr.id()==ID_xor)
4444
{
@@ -204,18 +204,14 @@ simplify_exprt::resultt<> simplify_exprt::simplify_not(const not_exprt &expr)
204204
else if(op.id()==ID_exists) // !(exists: a) <-> forall: not a
205205
{
206206
auto const &op_as_exists = to_exists_expr(op);
207-
forall_exprt rewritten_op(
208-
op_as_exists.symbol(), not_exprt(op_as_exists.where()));
209-
rewritten_op.where() = simplify_node(rewritten_op.where());
210-
return std::move(rewritten_op);
207+
return forall_exprt{op_as_exists.symbol(),
208+
simplify_not(not_exprt(op_as_exists.where()))};
211209
}
212210
else if(op.id() == ID_forall) // !(forall: a) <-> exists: not a
213211
{
214212
auto const &op_as_forall = to_forall_expr(op);
215-
exists_exprt rewritten_op(
216-
op_as_forall.symbol(), not_exprt(op_as_forall.where()));
217-
rewritten_op.where() = simplify_node(rewritten_op.where());
218-
return std::move(rewritten_op);
213+
return exists_exprt{op_as_forall.symbol(),
214+
simplify_not(not_exprt(op_as_forall.where()))};
219215
}
220216

221217
return unchanged(expr);

src/util/simplify_expr_if.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -357,24 +357,24 @@ simplify_exprt::resultt<> simplify_exprt::simplify_if(const if_exprt &expr)
357357
else if(falsevalue.is_false())
358358
{
359359
// a?b:0 <-> a AND b
360-
return changed(simplify_node(and_exprt(cond, truevalue)));
360+
return changed(simplify_boolean(and_exprt(cond, truevalue)));
361361
}
362362
else if(falsevalue.is_true())
363363
{
364364
// a?b:1 <-> !a OR b
365365
return changed(
366-
simplify_node(or_exprt(simplify_not(not_exprt(cond)), truevalue)));
366+
simplify_boolean(or_exprt(simplify_not(not_exprt(cond)), truevalue)));
367367
}
368368
else if(truevalue.is_true())
369369
{
370370
// a?1:b <-> a||(!a && b) <-> a OR b
371-
return changed(simplify_node(or_exprt(cond, falsevalue)));
371+
return changed(simplify_boolean(or_exprt(cond, falsevalue)));
372372
}
373373
else if(truevalue.is_false())
374374
{
375375
// a?0:b <-> !a && b
376-
return changed(
377-
simplify_node(and_exprt(simplify_not(not_exprt(cond)), falsevalue)));
376+
return changed(simplify_boolean(
377+
and_exprt(simplify_not(not_exprt(cond)), falsevalue)));
378378
}
379379
}
380380
}

src/util/simplify_expr_int.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ simplify_exprt::simplify_minus(const minus_exprt &expr)
570570
// rewrite "a-b" to "a+(-b)"
571571
unary_minus_exprt rhs_negated(operands[1]);
572572
plus_exprt plus_expr(operands[0], simplify_unary_minus(rhs_negated));
573-
return changed(simplify_node(plus_expr));
573+
return changed(simplify_plus(plus_expr));
574574
}
575575
else if(
576576
minus_expr.type().id() == ID_pointer &&
@@ -646,10 +646,9 @@ simplify_exprt::simplify_bitwise(const multi_ary_exprt &expr)
646646
}
647647

648648
new_expr.type()=bool_typet();
649-
new_expr = simplify_node(new_expr);
649+
new_expr = simplify_boolean(new_expr);
650650

651-
new_expr = typecast_exprt(new_expr, expr.type());
652-
return changed(simplify_node(new_expr));
651+
return changed(simplify_typecast(typecast_exprt(new_expr, expr.type())));
653652
}
654653
}
655654

src/util/simplify_expr_pointer.cpp

+12-25
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
281281
auto new_expr = expr;
282282
new_expr.op() = op;
283283

284-
return changed(simplify_node(new_expr)); // recursive call
284+
return changed(simplify_pointer_offset(new_expr)); // recursive call
285285
}
286286
else if(op_type.id()==ID_signedbv ||
287287
op_type.id()==ID_unsignedbv)
@@ -291,8 +291,7 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
291291
if(op.is_constant())
292292
{
293293
// (T *)0x1234 -> 0x1234
294-
exprt tmp = typecast_exprt(op, expr.type());
295-
return changed(simplify_node(tmp));
294+
return changed(simplify_typecast(typecast_exprt{op, expr.type()}));
296295
}
297296
else
298297
{
@@ -340,7 +339,7 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
340339
{
341340
exprt tmp=op;
342341
if(tmp.type()!=expr.type())
343-
tmp = simplify_node(typecast_exprt(tmp, expr.type()));
342+
tmp = simplify_typecast(typecast_exprt(tmp, expr.type()));
344343

345344
int_expr.push_back(tmp);
346345
}
@@ -359,29 +358,23 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
359358
return unchanged(expr);
360359

361360
// this might change the type of the pointer!
362-
exprt pointer_offset_expr = simplify_node(pointer_offset(ptr_expr.front()));
361+
exprt pointer_offset_expr =
362+
simplify_pointer_offset(to_unary_expr(pointer_offset(ptr_expr.front())));
363363

364364
exprt sum;
365365

366366
if(int_expr.size()==1)
367367
sum=int_expr.front();
368368
else
369-
{
370-
sum=exprt(ID_plus, expr.type());
371-
sum.operands()=int_expr;
372-
}
373-
374-
sum = simplify_node(sum);
369+
sum = simplify_plus(plus_exprt{int_expr, expr.type()});
375370

376371
exprt size_expr = from_integer(*element_size, expr.type());
377372

378-
exprt product = mult_exprt(sum, size_expr);
379-
380-
product = simplify_node(product);
373+
exprt product = simplify_mult(mult_exprt{sum, size_expr});
381374

382375
auto new_expr = plus_exprt(pointer_offset_expr, product);
383376

384-
return changed(simplify_node(new_expr));
377+
return changed(simplify_plus(new_expr));
385378
}
386379
else if(ptr.id()==ID_constant)
387380
{
@@ -390,8 +383,7 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
390383
if(c_ptr.get_value()==ID_NULL ||
391384
c_ptr.value_is_zero_string())
392385
{
393-
auto new_expr = from_integer(0, expr.type());
394-
return changed(simplify_node(new_expr));
386+
return from_integer(0, expr.type());
395387
}
396388
else
397389
{
@@ -408,9 +400,7 @@ simplify_exprt::simplify_pointer_offset(const unary_exprt &expr)
408400
*pointer_offset_bits(ptr.type(), ns) - config.bv_encoding.object_bits;
409401
number%=power(2, offset_bits);
410402

411-
auto new_expr = from_integer(number, expr.type());
412-
413-
return changed(simplify_node(new_expr));
403+
return from_integer(number, expr.type());
414404
}
415405
}
416406

@@ -679,10 +669,7 @@ simplify_exprt::simplify_object_size(const unary_exprt &expr)
679669
exprt size = size_opt.value();
680670

681671
if(size.type() != expr_type)
682-
{
683-
size = typecast_exprt(size, expr_type);
684-
size = simplify_node(size);
685-
}
672+
size = simplify_typecast(typecast_exprt(size, expr_type));
686673

687674
return size;
688675
}
@@ -708,5 +695,5 @@ simplify_exprt::simplify_good_pointer(const unary_exprt &expr)
708695
exprt def = good_pointer_def(expr.op(), ns);
709696

710697
// recursive call
711-
return changed(simplify_node(def));
698+
return changed(simplify_rec(def));
712699
}

src/util/simplify_expr_struct.cpp

+6-15
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,8 @@ simplify_exprt::simplify_member(const member_exprt &expr)
4747
DATA_INVARIANT(
4848
op2.type() == expr.type(),
4949
"member expression type must match component type");
50-
exprt tmp;
51-
tmp.swap(op2);
5250

53-
// do this recursively
54-
return changed(simplify_rec(tmp));
51+
return op2;
5552
}
5653
else // something else, get rid of it
5754
new_operands.resize(new_operands.size() - 2);
@@ -71,10 +68,7 @@ simplify_exprt::simplify_member(const member_exprt &expr)
7168
if(with_expr.where().get(ID_component_name)==component_name)
7269
{
7370
// WITH(s, .m, v).m -> v
74-
auto tmp = with_expr.new_value();
75-
76-
// do this recursively
77-
return changed(simplify_rec(tmp));
71+
return with_expr.new_value();
7872
}
7973
}
8074
}
@@ -93,10 +87,7 @@ simplify_exprt::simplify_member(const member_exprt &expr)
9387
if(designator.front().get(ID_component_name)==component_name)
9488
{
9589
// UPDATE(s, .m, v).m -> v
96-
exprt tmp=update_expr.new_value();
97-
98-
// do this recursively
99-
return changed(simplify_rec(tmp));
90+
return update_expr.new_value();
10091
}
10192
// the following optimization only works on structs,
10293
// and not on unions
@@ -107,7 +98,7 @@ simplify_exprt::simplify_member(const member_exprt &expr)
10798
new_expr.struct_op() = update_expr.old();
10899

109100
// do this recursively
110-
return changed(simplify_rec(new_expr));
101+
return changed(simplify_member(new_expr));
111102
}
112103
}
113104
}
@@ -158,12 +149,12 @@ simplify_exprt::simplify_member(const member_exprt &expr)
158149
const exprt &struct_offset = byte_extract_expr.offset();
159150
exprt member_offset = from_integer(*offset_int, struct_offset.type());
160151
exprt final_offset =
161-
simplify_node(plus_exprt(struct_offset, member_offset));
152+
simplify_plus(plus_exprt(struct_offset, member_offset));
162153

163154
byte_extract_exprt result(
164155
op.id(), byte_extract_expr.op(), final_offset, expr.type());
165156

166-
return changed(simplify_rec(result)); // recursive call
157+
return changed(simplify_byte_extract(result)); // recursive call
167158
}
168159
else if(op_type.id() == ID_union)
169160
{

0 commit comments

Comments
 (0)