Skip to content

Commit be5a2d5

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

8 files changed

+78
-127
lines changed

src/util/simplify_expr.cpp

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -571,8 +571,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
571571
op_type.id() == ID_floatbv ? ID_ieee_float_notequal : ID_notequal,
572572
from_integer(0, op_type));
573573
inequality.add_source_location()=expr.source_location();
574-
simplify_node(inequality);
575-
return std::move(inequality);
574+
return changed(simplify_node(inequality));
576575
}
577576

578577
// eliminate casts from proper bool
@@ -611,9 +610,8 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
611610
{
612611
// rewrite (_Bool)x to (_Bool)(x!=0)
613612
exprt inequality = is_not_zero(expr.op(), ns);
614-
simplify_node(inequality);
615613
auto new_expr = expr;
616-
new_expr.op() = std::move(inequality);
614+
new_expr.op() = simplify_node(std::move(inequality));
617615
return changed(simplify_typecast(new_expr)); // recursive call
618616
}
619617

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

727-
simplify_node(result); // possibly recursive call
728-
729-
return std::move(result);
725+
return changed(simplify_node(result)); // possibly recursive call
730726
}
731727
}
732728
else if(op_id==ID_ashr || op_id==ID_lshr || op_id==ID_shl)
@@ -1978,10 +1974,9 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19781974
{
19791975
exprt compo_offset = from_integer(*i, offset.type());
19801976
plus_exprt new_offset(offset, compo_offset);
1981-
simplify_node(new_offset);
19821977
exprt new_value(with.new_value());
19831978
auto tmp = expr;
1984-
tmp.set_offset(std::move(new_offset));
1979+
tmp.set_offset(simplify_node(std::move(new_offset)));
19851980
tmp.set_value(std::move(new_value));
19861981
return changed(simplify_byte_update(tmp)); // recursive call
19871982
}
@@ -1993,22 +1988,20 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19931988
if(i.has_value())
19941989
{
19951990
const exprt &index=with.where();
1996-
mult_exprt index_offset(index, from_integer(*i, index.type()));
1997-
simplify_node(index_offset);
1991+
exprt index_offset =
1992+
simplify_node(mult_exprt(index, from_integer(*i, index.type())));
19981993

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

20072001
plus_exprt new_offset(offset, index_offset);
2008-
simplify_node(new_offset);
20092002
exprt new_value(with.new_value());
20102003
auto tmp = expr;
2011-
tmp.set_offset(std::move(new_offset));
2004+
tmp.set_offset(simplify_node(std::move(new_offset)));
20122005
tmp.set_value(std::move(new_value));
20132006
return changed(simplify_byte_update(tmp)); // recursive call
20142007
}
@@ -2226,20 +2219,19 @@ bool simplify_exprt::simplify_node_preorder(exprt &expr)
22262219
return result;
22272220
}
22282221

2229-
bool simplify_exprt::simplify_node(exprt &expr)
2222+
simplify_exprt::resultt<> simplify_exprt::simplify_node(exprt node)
22302223
{
2231-
if(!expr.has_operands())
2232-
return true; // no change
2224+
if(!node.has_operands())
2225+
return unchanged(node); // no change
22332226

22342227
// #define DEBUGX
22352228

22362229
#ifdef DEBUGX
2237-
exprt old(expr);
2230+
exprt old(node);
22382231
#endif
22392232

2240-
bool no_change = true;
2241-
2242-
no_change = sort_and_join(expr) && no_change;
2233+
exprt expr = node;
2234+
bool no_change_sort_and_join = sort_and_join(expr);
22432235

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

@@ -2440,26 +2432,23 @@ bool simplify_exprt::simplify_node(exprt &expr)
24402432
r = simplify_complex(to_unary_expr(expr));
24412433
}
24422434

2443-
if(r.has_changed())
2444-
{
2445-
expr = r.expr;
2446-
no_change = false;
2447-
}
2435+
if(!no_change_sort_and_join)
2436+
r = changed(r);
24482437

24492438
#ifdef DEBUGX
24502439
if(
2451-
!no_change
2440+
r.has_changed()
24522441
# ifdef DEBUG_ON_DEMAND
24532442
&& debug_on
24542443
# endif
24552444
)
24562445
{
2457-
std::cout << "===== " << old.id() << ": " << format(old) << '\n'
2458-
<< " ---> " << format(expr) << '\n';
2446+
std::cout << "===== " << node.id() << ": " << format(node) << '\n'
2447+
<< " ---> " << format(r.expr) << '\n';
24592448
}
24602449
#endif
24612450

2462-
return no_change;
2451+
return r;
24632452
}
24642453

24652454
simplify_exprt::resultt<> simplify_exprt::simplify_rec(const exprt &expr)
@@ -2485,30 +2474,35 @@ simplify_exprt::resultt<> simplify_exprt::simplify_rec(const exprt &expr)
24852474

24862475
// We work on a copy to prevent unnecessary destruction of sharing.
24872476
exprt tmp=expr;
2488-
bool result = simplify_node_preorder(tmp);
2477+
bool no_change = simplify_node_preorder(tmp);
24892478

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

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

2511-
if(result) // no change
2505+
if(no_change) // no change
25122506
{
25132507
return unchanged(expr);
25142508
}

src/util/simplify_expr_array.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ simplify_exprt::simplify_index(const index_exprt &expr)
184184
// add offset to index
185185
mult_exprt offset(
186186
from_integer(*sub_size, byte_extract_expr.offset().type()), index);
187-
plus_exprt final_offset(byte_extract_expr.offset(), offset);
188-
simplify_node(final_offset);
187+
exprt final_offset =
188+
simplify_node(plus_exprt(byte_extract_expr.offset(), offset));
189189

190190
exprt result_expr(array.id(), expr.type());
191191
result_expr.add_to_operands(byte_extract_expr.op(), final_offset);

src/util/simplify_expr_boolean.cpp

Lines changed: 4 additions & 6 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
{
@@ -192,8 +191,7 @@ simplify_exprt::resultt<> simplify_exprt::simplify_not(const not_exprt &expr)
192191

193192
Forall_operands(it, tmp)
194193
{
195-
*it = boolean_negate(*it);
196-
simplify_node(*it);
194+
*it = simplify_node(boolean_negate(*it));
197195
}
198196

199197
tmp.id(tmp.id() == ID_and ? ID_or : ID_and);
@@ -211,15 +209,15 @@ simplify_exprt::resultt<> simplify_exprt::simplify_not(const not_exprt &expr)
211209
auto const &op_as_exists = to_exists_expr(op);
212210
forall_exprt rewritten_op(
213211
op_as_exists.symbol(), not_exprt(op_as_exists.where()));
214-
simplify_node(rewritten_op.where());
212+
rewritten_op.where() = simplify_node(rewritten_op.where());
215213
return std::move(rewritten_op);
216214
}
217215
else if(op.id() == ID_forall) // !(forall: a) <-> exists: not a
218216
{
219217
auto const &op_as_forall = to_forall_expr(op);
220218
exists_exprt rewritten_op(
221219
op_as_forall.symbol(), not_exprt(op_as_forall.where()));
222-
simplify_node(rewritten_op.where());
220+
rewritten_op.where() = simplify_node(rewritten_op.where());
223221
return std::move(rewritten_op);
224222
}
225223

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(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)