Skip to content

Commit a2f0a3b

Browse files
author
Daniel Kroening
committed
simplifier: new interface for simplify_node
This improves type safety.
1 parent b20cf69 commit a2f0a3b

8 files changed

+75
-125
lines changed

src/util/simplify_expr.cpp

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
572572
op_type.id() == ID_floatbv ? ID_ieee_float_notequal : ID_notequal,
573573
from_integer(0, op_type));
574574
inequality.add_source_location()=expr.source_location();
575-
simplify_node(inequality);
576-
return std::move(inequality);
575+
return changed(simplify_node(inequality));
577576
}
578577

579578
// eliminate casts from proper bool
@@ -612,9 +611,8 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
612611
{
613612
// rewrite (_Bool)x to (_Bool)(x!=0)
614613
exprt inequality = is_not_zero(expr.op(), ns);
615-
simplify_node(inequality);
616614
auto new_expr = expr;
617-
new_expr.op() = std::move(inequality);
615+
new_expr.op() = simplify_node(std::move(inequality));
618616
return changed(simplify_typecast(new_expr)); // recursive call
619617
}
620618

@@ -725,9 +723,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
725723
*it = simplify_typecast(new_operand); // recursive call
726724
}
727725

728-
simplify_node(result); // possibly recursive call
729-
730-
return std::move(result);
726+
return changed(simplify_node(result)); // possibly recursive call
731727
}
732728
}
733729
else if(op_id==ID_ashr || op_id==ID_lshr || op_id==ID_shl)
@@ -1977,10 +1973,9 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19771973
{
19781974
exprt compo_offset = from_integer(*i, offset.type());
19791975
plus_exprt new_offset(offset, compo_offset);
1980-
simplify_node(new_offset);
19811976
exprt new_value(with.new_value());
19821977
auto tmp = expr;
1983-
tmp.set_offset(std::move(new_offset));
1978+
tmp.set_offset(simplify_node(std::move(new_offset)));
19841979
tmp.set_value(std::move(new_value));
19851980
return changed(simplify_byte_update(tmp)); // recursive call
19861981
}
@@ -1992,22 +1987,20 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19921987
if(i.has_value())
19931988
{
19941989
const exprt &index=with.where();
1995-
mult_exprt index_offset(index, from_integer(*i, index.type()));
1996-
simplify_node(index_offset);
1990+
exprt index_offset =
1991+
simplify_node(mult_exprt(index, from_integer(*i, index.type())));
19971992

19981993
// index_offset may need a typecast
19991994
if(offset.type() != index.type())
20001995
{
20011996
typecast_exprt tmp(index_offset, offset.type());
2002-
simplify_node(tmp);
2003-
index_offset.swap(tmp);
1997+
index_offset = simplify_node(std::move(tmp));
20041998
}
20051999

20062000
plus_exprt new_offset(offset, index_offset);
2007-
simplify_node(new_offset);
20082001
exprt new_value(with.new_value());
20092002
auto tmp = expr;
2010-
tmp.set_offset(std::move(new_offset));
2003+
tmp.set_offset(simplify_node(std::move(new_offset)));
20112004
tmp.set_value(std::move(new_value));
20122005
return changed(simplify_byte_update(tmp)); // recursive call
20132006
}
@@ -2225,20 +2218,19 @@ bool simplify_exprt::simplify_node_preorder(exprt &expr)
22252218
return result;
22262219
}
22272220

2228-
bool simplify_exprt::simplify_node(exprt &expr)
2221+
simplify_exprt::resultt<> simplify_exprt::simplify_node(const exprt &node)
22292222
{
2230-
if(!expr.has_operands())
2231-
return true; // no change
2223+
if(!node.has_operands())
2224+
return unchanged(node); // no change
22322225

22332226
// #define DEBUGX
22342227

22352228
#ifdef DEBUGX
2236-
exprt old(expr);
2229+
exprt old(node);
22372230
#endif
22382231

2239-
bool no_change = true;
2240-
2241-
no_change = sort_and_join(expr) && no_change;
2232+
exprt expr = node;
2233+
bool no_change_sort_and_join = sort_and_join(expr);
22422234

22432235
resultt<> r = unchanged(expr);
22442236

@@ -2439,26 +2431,23 @@ bool simplify_exprt::simplify_node(exprt &expr)
24392431
r = simplify_complex(to_unary_expr(expr));
24402432
}
24412433

2442-
if(r.has_changed())
2443-
{
2444-
expr = r.expr;
2445-
no_change = false;
2446-
}
2434+
if(!no_change_sort_and_join)
2435+
r = changed(r);
24472436

24482437
#ifdef DEBUGX
24492438
if(
2450-
!no_change
2439+
r.has_changed()
24512440
# ifdef DEBUG_ON_DEMAND
24522441
&& debug_on
24532442
# endif
24542443
)
24552444
{
2456-
std::cout << "===== " << old.id() << ": " << format(old) << '\n'
2457-
<< " ---> " << format(expr) << '\n';
2445+
std::cout << "===== " << node.id() << ": " << format(node) << '\n'
2446+
<< " ---> " << format(r.expr) << '\n';
24582447
}
24592448
#endif
24602449

2461-
return no_change;
2450+
return r;
24622451
}
24632452

24642453
simplify_exprt::resultt<> simplify_exprt::simplify_rec(const exprt &expr)
@@ -2484,30 +2473,35 @@ simplify_exprt::resultt<> simplify_exprt::simplify_rec(const exprt &expr)
24842473

24852474
// We work on a copy to prevent unnecessary destruction of sharing.
24862475
exprt tmp=expr;
2487-
bool result = simplify_node_preorder(tmp);
2476+
bool no_change = simplify_node_preorder(tmp);
24882477

2489-
if(!simplify_node(tmp))
2490-
result=false;
2478+
auto simplify_node_result = simplify_node(tmp);
2479+
2480+
if(simplify_node_result.has_changed())
2481+
{
2482+
no_change = false;
2483+
tmp = simplify_node_result.expr;
2484+
}
24912485

24922486
#ifdef USE_LOCAL_REPLACE_MAP
24932487
#if 1
24942488
replace_mapt::const_iterator it=local_replace_map.find(tmp);
24952489
if(it!=local_replace_map.end())
24962490
{
24972491
tmp=it->second;
2498-
result=false;
2492+
no_change = false;
24992493
}
25002494
#else
25012495
if(!local_replace_map.empty() &&
25022496
!replace_expr(local_replace_map, tmp))
25032497
{
25042498
simplify_rec(tmp);
2505-
result=false;
2499+
no_change = false;
25062500
}
25072501
#endif
25082502
#endif
25092503

2510-
if(result) // no change
2504+
if(no_change) // no change
25112505
{
25122506
return unchanged(expr);
25132507
}

src/util/simplify_expr_array.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,7 @@ simplify_exprt::simplify_index(const index_exprt &expr)
180180

181181
// add offset to index
182182
mult_exprt offset(from_integer(*sub_size, array.op1().type()), index);
183-
plus_exprt final_offset(array.op1(), offset);
184-
simplify_node(final_offset);
183+
exprt final_offset = simplify_node(plus_exprt(array.op1(), offset));
185184

186185
exprt result_expr(array.id(), expr.type());
187186
result_expr.add_to_operands(array.op0(), final_offset);

src/util/simplify_expr_boolean.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ simplify_exprt::resultt<> simplify_exprt::simplify_boolean(const exprt &expr)
4141
binary_exprt new_expr = implies_expr;
4242
new_expr.id(ID_or);
4343
new_expr.op0() = boolean_negate(new_expr.op0());
44-
simplify_node(new_expr);
45-
return std::move(new_expr);
44+
return changed(simplify_node(new_expr));
4645
}
4746
else if(expr.id()==ID_xor)
4847
{
@@ -193,8 +192,7 @@ simplify_exprt::resultt<> simplify_exprt::simplify_not(const not_exprt &expr)
193192

194193
Forall_operands(it, tmp)
195194
{
196-
*it = boolean_negate(*it);
197-
simplify_node(*it);
195+
*it = simplify_node(boolean_negate(*it));
198196
}
199197

200198
tmp.id(tmp.id() == ID_and ? ID_or : ID_and);
@@ -212,16 +210,16 @@ simplify_exprt::resultt<> simplify_exprt::simplify_not(const not_exprt &expr)
212210
auto const &op_as_exists = to_exists_expr(op);
213211
forall_exprt rewritten_op(
214212
op_as_exists.symbol(), not_exprt(op_as_exists.where()));
215-
simplify_node(rewritten_op.where());
213+
rewritten_op.where() = simplify_node(rewritten_op.where());
216214
return std::move(rewritten_op);
217215
}
218216
else if(op.id() == ID_forall) // !(forall: a) <-> exists: not a
219217
{
220218
auto const &op_as_forall = to_forall_expr(op);
221219
exists_exprt rewritten_op(
222220
op_as_forall.symbol(), not_exprt(op_as_forall.where()));
223-
simplify_node(rewritten_op.where());
224-
return std::move(rewritten_op);
221+
rewritten_op.where() = simplify_node(rewritten_op.where());
222+
return changed(rewritten_op);
225223
}
226224

227225
return unchanged(expr);

src/util/simplify_expr_class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class simplify_exprt
210210
NODISCARD resultt<> simplify_inequality_pointer_object(const exprt &);
211211

212212
// main recursion
213-
bool simplify_node(exprt &expr);
213+
NODISCARD resultt<> simplify_node(const exprt &);
214214
bool simplify_node_preorder(exprt &expr);
215215
NODISCARD resultt<> simplify_rec(const exprt &);
216216

src/util/simplify_expr_if.cpp

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -350,41 +350,29 @@ simplify_exprt::resultt<> simplify_exprt::simplify_if(const if_exprt &expr)
350350
else if(truevalue.is_false() && falsevalue.is_true())
351351
{
352352
// a?0:1 <-> !a
353-
exprt tmp = boolean_negate(cond);
354-
simplify_node(tmp);
355-
return std::move(tmp);
353+
return changed(simplify_node(boolean_negate(cond)));
356354
}
357355
else if(falsevalue.is_false())
358356
{
359357
// a?b:0 <-> a AND b
360-
and_exprt tmp(cond, truevalue);
361-
simplify_node(tmp);
362-
return std::move(tmp);
358+
return changed(simplify_node(and_exprt(cond, truevalue)));
363359
}
364360
else if(falsevalue.is_true())
365361
{
366362
// a?b:1 <-> !a OR b
367-
exprt tmp_not_cond = boolean_negate(cond);
368-
simplify_node(tmp_not_cond);
369-
or_exprt tmp(tmp_not_cond, truevalue);
370-
simplify_node(tmp);
371-
return std::move(tmp);
363+
return changed(simplify_node(
364+
or_exprt(simplify_node(boolean_negate(cond)), truevalue)));
372365
}
373366
else if(truevalue.is_true())
374367
{
375368
// a?1:b <-> a||(!a && b) <-> a OR b
376-
or_exprt tmp(cond, falsevalue);
377-
simplify_node(tmp);
378-
return std::move(tmp);
369+
return changed(simplify_node(or_exprt(cond, falsevalue)));
379370
}
380371
else if(truevalue.is_false())
381372
{
382373
// a?0:b <-> !a && b
383-
exprt tmp_not_cond = boolean_negate(cond);
384-
simplify_node(tmp_not_cond);
385-
and_exprt tmp(tmp_not_cond, falsevalue);
386-
simplify_node(tmp);
387-
return std::move(tmp);
374+
return changed(simplify_node(
375+
and_exprt(simplify_node(boolean_negate(cond)), falsevalue)));
388376
}
389377
}
390378
}

src/util/simplify_expr_int.cpp

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -568,9 +568,7 @@ simplify_exprt::simplify_minus(const minus_exprt &expr)
568568
// rewrite "a-b" to "a+(-b)"
569569
unary_minus_exprt rhs_negated(operands[1]);
570570
plus_exprt plus_expr(operands[0], simplify_unary_minus(rhs_negated));
571-
simplify_node(plus_expr);
572-
573-
return std::move(plus_expr);
571+
return changed(simplify_node(plus_expr));
574572
}
575573
else if(
576574
minus_expr.type().id() == ID_pointer &&
@@ -649,12 +647,10 @@ simplify_exprt::resultt<> simplify_exprt::simplify_bitwise(const exprt &expr)
649647
}
650648

651649
new_expr.type()=bool_typet();
652-
simplify_node(new_expr);
650+
new_expr = simplify_node(new_expr);
653651

654652
new_expr = typecast_exprt(new_expr, expr.type());
655-
simplify_node(new_expr);
656-
657-
return std::move(new_expr);
653+
return changed(simplify_node(new_expr));
658654
}
659655
}
660656

@@ -1486,8 +1482,7 @@ simplify_exprt::simplify_inequality_no_constant(const exprt &expr)
14861482
new_expr.id(ID_equal);
14871483
new_expr = simplify_inequality_no_constant(new_expr);
14881484
new_expr = boolean_negate(new_expr);
1489-
simplify_node(new_expr);
1490-
return std::move(new_expr);
1485+
return changed(simplify_node(new_expr));
14911486
}
14921487
else if(expr.id()==ID_gt)
14931488
{
@@ -1497,17 +1492,15 @@ simplify_exprt::simplify_inequality_no_constant(const exprt &expr)
14971492
new_expr.op0().swap(new_expr.op1());
14981493
new_expr = simplify_inequality_no_constant(new_expr);
14991494
new_expr = boolean_negate(new_expr);
1500-
simplify_node(new_expr);
1501-
return std::move(new_expr);
1495+
return changed(simplify_node(new_expr));
15021496
}
15031497
else if(expr.id()==ID_lt)
15041498
{
15051499
auto new_expr = expr;
15061500
new_expr.id(ID_ge);
15071501
new_expr = simplify_inequality_no_constant(new_expr);
15081502
new_expr = boolean_negate(new_expr);
1509-
simplify_node(new_expr);
1510-
return std::move(new_expr);
1503+
return changed(simplify_node(new_expr));
15111504
}
15121505
else if(expr.id()==ID_le)
15131506
{
@@ -1588,10 +1581,9 @@ simplify_exprt::simplify_inequality_no_constant(const exprt &expr)
15881581
if(!eliminate_common_addends(new_expr.op0(), new_expr.op1()))
15891582
{
15901583
// remove zeros
1591-
simplify_node(new_expr.op0());
1592-
simplify_node(new_expr.op1());
1593-
new_expr = simplify_inequality(new_expr); // recursive call
1594-
return std::move(new_expr);
1584+
new_expr.op0() = simplify_node(new_expr.op0());
1585+
new_expr.op1() = simplify_node(new_expr.op1());
1586+
return changed(simplify_inequality(new_expr)); // recursive call
15951587
}
15961588
}
15971589

@@ -1625,8 +1617,7 @@ simplify_exprt::simplify_inequality_rhs_is_constant(const exprt &expr)
16251617
new_expr.id(ID_equal);
16261618
new_expr = simplify_inequality_rhs_is_constant(new_expr);
16271619
new_expr = boolean_negate(new_expr);
1628-
simplify_node(new_expr);
1629-
return std::move(new_expr);
1620+
return changed(simplify_node(new_expr));
16301621
}
16311622

16321623
// very special case for pointers
@@ -1839,8 +1830,7 @@ simplify_exprt::simplify_inequality_rhs_is_constant(const exprt &expr)
18391830
new_expr.id(ID_equal);
18401831
new_expr = simplify_inequality_rhs_is_constant(new_expr);
18411832
new_expr = boolean_negate(new_expr);
1842-
simplify_node(new_expr);
1843-
return std::move(new_expr);
1833+
return changed(simplify_node(new_expr));
18441834
}
18451835
else if(expr.id()==ID_gt)
18461836
{
@@ -1863,8 +1853,7 @@ simplify_exprt::simplify_inequality_rhs_is_constant(const exprt &expr)
18631853
new_expr.id(ID_ge);
18641854
new_expr = simplify_inequality_rhs_is_constant(new_expr);
18651855
new_expr = boolean_negate(new_expr);
1866-
simplify_node(new_expr);
1867-
return std::move(new_expr);
1856+
return changed(simplify_node(new_expr));
18681857
}
18691858
else if(expr.id()==ID_le)
18701859
{
@@ -1881,8 +1870,7 @@ simplify_exprt::simplify_inequality_rhs_is_constant(const exprt &expr)
18811870
new_expr.op1() = from_integer(i, new_expr.op1().type());
18821871
new_expr = simplify_inequality_rhs_is_constant(new_expr);
18831872
new_expr = boolean_negate(new_expr);
1884-
simplify_node(new_expr);
1885-
return std::move(new_expr);
1873+
return changed(simplify_node(new_expr));
18861874
}
18871875
}
18881876
#endif

0 commit comments

Comments
 (0)