Skip to content

Commit f936554

Browse files
author
Daniel Kroening
committed
simplifier: new interface for simplify_if
This improves type safety.
1 parent 021f971 commit f936554

File tree

5 files changed

+32
-54
lines changed

5 files changed

+32
-54
lines changed

src/util/simplify_expr.cpp

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -991,9 +991,7 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
991991

992992
if_exprt tmp{if_expr.cond(), tmp_op1_result, tmp_op2_result};
993993

994-
simplify_if(tmp);
995-
996-
return tmp;
994+
return changed(simplify_if(tmp));
997995
}
998996

999997
if(pointer.id()==ID_address_of)
@@ -1311,13 +1309,12 @@ bool simplify_exprt::simplify_if_preorder(if_exprt &expr)
13111309
return result;
13121310
}
13131311

1314-
bool simplify_exprt::simplify_if(if_exprt &expr)
1312+
NODISCARD simplify_exprt::resultt<>
1313+
simplify_exprt::simplify_if(const if_exprt &expr)
13151314
{
1316-
exprt &cond=expr.cond();
1317-
exprt &truevalue=expr.true_case();
1318-
exprt &falsevalue=expr.false_case();
1319-
1320-
bool result=true;
1315+
const exprt &cond = expr.cond();
1316+
const exprt &truevalue = expr.true_case();
1317+
const exprt &falsevalue = expr.false_case();
13211318

13221319
if(do_simplify_if)
13231320
{
@@ -1333,26 +1330,21 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13331330
if(truevalue.is_true() && falsevalue.is_false())
13341331
{
13351332
// a?1:0 <-> a
1336-
exprt tmp;
1337-
tmp.swap(cond);
1338-
expr.swap(tmp);
1339-
return false;
1333+
return cond;
13401334
}
13411335
else if(truevalue.is_false() && falsevalue.is_true())
13421336
{
13431337
// a?0:1 <-> !a
13441338
exprt tmp = boolean_negate(cond);
13451339
simplify_node(tmp);
1346-
expr.swap(tmp);
1347-
return false;
1340+
return std::move(tmp);
13481341
}
13491342
else if(falsevalue.is_false())
13501343
{
13511344
// a?b:0 <-> a AND b
13521345
and_exprt tmp(cond, truevalue);
13531346
simplify_node(tmp);
1354-
expr.swap(tmp);
1355-
return false;
1347+
return std::move(tmp);
13561348
}
13571349
else if(falsevalue.is_true())
13581350
{
@@ -1361,16 +1353,14 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13611353
simplify_node(tmp_not_cond);
13621354
or_exprt tmp(tmp_not_cond, truevalue);
13631355
simplify_node(tmp);
1364-
expr.swap(tmp);
1365-
return false;
1356+
return std::move(tmp);
13661357
}
13671358
else if(truevalue.is_true())
13681359
{
13691360
// a?1:b <-> a||(!a && b) <-> a OR b
13701361
or_exprt tmp(cond, falsevalue);
13711362
simplify_node(tmp);
1372-
expr.swap(tmp);
1373-
return false;
1363+
return std::move(tmp);
13741364
}
13751365
else if(truevalue.is_false())
13761366
{
@@ -1379,19 +1369,13 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13791369
simplify_node(tmp_not_cond);
13801370
and_exprt tmp(tmp_not_cond, falsevalue);
13811371
simplify_node(tmp);
1382-
expr.swap(tmp);
1383-
return false;
1372+
return std::move(tmp);
13841373
}
13851374
}
13861375
}
13871376

13881377
if(truevalue==falsevalue)
1389-
{
1390-
exprt tmp;
1391-
tmp.swap(truevalue);
1392-
expr.swap(tmp);
1393-
return false;
1394-
}
1378+
return truevalue;
13951379

13961380
// this pushes the if-then-else into struct and array constructors
13971381
if(((truevalue.id()==ID_struct && falsevalue.id()==ID_struct) ||
@@ -1409,17 +1393,14 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
14091393

14101394
for(const auto &pair : range_true.zip(range_false))
14111395
{
1412-
if_exprt if_expr(cond_copy, pair.first, pair.second);
1413-
simplify_if(if_expr);
1414-
new_expr.operands().push_back(std::move(if_expr));
1396+
new_expr.operands().push_back(
1397+
simplify_if(if_exprt(cond_copy, pair.first, pair.second)));
14151398
}
14161399

1417-
expr.swap(new_expr);
1418-
1419-
return false;
1400+
return std::move(new_expr);
14201401
}
14211402

1422-
return result;
1403+
return unchanged(expr);
14231404
}
14241405

14251406
bool simplify_exprt::get_values(
@@ -1994,8 +1975,7 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
19941975
simplify_byte_extract(to_byte_extract_expr(if_expr.true_case()));
19951976
if_expr.false_case() =
19961977
simplify_byte_extract(to_byte_extract_expr(if_expr.false_case()));
1997-
simplify_if(if_expr);
1998-
return std::move(if_expr);
1978+
return simplify_if(if_expr);
19991979
}
20001980

20011981
const auto el_size = pointer_offset_bits(expr.type(), ns);
@@ -2523,7 +2503,14 @@ bool simplify_exprt::simplify_node(exprt &expr)
25232503
expr.id()==ID_ge || expr.id()==ID_le)
25242504
no_change = simplify_inequality(expr) && no_change;
25252505
else if(expr.id()==ID_if)
2526-
no_change = simplify_if(to_if_expr(expr)) && no_change;
2506+
{
2507+
auto r = simplify_if(to_if_expr(expr));
2508+
if(r.has_changed())
2509+
{
2510+
no_change = false;
2511+
expr = r.expr;
2512+
}
2513+
}
25272514
else if(expr.id()==ID_lambda)
25282515
no_change = simplify_lambda(expr) && no_change;
25292516
else if(expr.id()==ID_with)

src/util/simplify_expr_array.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,7 @@ bool simplify_exprt::simplify_index(exprt &expr)
102102
}
103103

104104
if_exprt if_expr(equality_expr, with_expr.new_value(), new_index_expr);
105-
simplify_if(if_expr);
106-
107-
expr.swap(if_expr);
108-
105+
expr = simplify_if(if_expr).expr;
109106
return false;
110107
}
111108
}

src/util/simplify_expr_class.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ class simplify_exprt
143143
NODISCARD resultt<> simplify_power(const exprt &);
144144
NODISCARD resultt<> simplify_bitwise(const exprt &);
145145
bool simplify_if_preorder(if_exprt &expr);
146-
bool simplify_if(if_exprt &expr);
146+
NODISCARD resultt<> simplify_if(const if_exprt &);
147147
bool simplify_bitnot(exprt &expr);
148148
bool simplify_not(exprt &expr);
149149
bool simplify_boolean(exprt &expr);

src/util/simplify_expr_int.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,9 +1261,7 @@ bool simplify_exprt::simplify_inequality(exprt &expr)
12611261
if_exprt if_expr=lift_if(expr, 0);
12621262
simplify_inequality(if_expr.true_case());
12631263
simplify_inequality(if_expr.false_case());
1264-
simplify_if(if_expr);
1265-
expr.swap(if_expr);
1266-
1264+
expr = simplify_if(if_expr).expr;
12671265
return false;
12681266
}
12691267

@@ -1640,9 +1638,7 @@ bool simplify_exprt::simplify_inequality_rhs_is_constant(exprt &expr)
16401638
if_exprt if_expr=lift_if(expr, 0);
16411639
simplify_inequality_rhs_is_constant(if_expr.true_case());
16421640
simplify_inequality_rhs_is_constant(if_expr.false_case());
1643-
simplify_if(if_expr);
1644-
expr.swap(if_expr);
1645-
1641+
expr = simplify_if(if_expr);
16461642
return false;
16471643
}
16481644

src/util/simplify_expr_pointer.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,7 @@ simplify_exprt::simplify_pointer_offset(const exprt &expr)
243243
if_exprt if_expr=lift_if(expr, 0);
244244
if_expr.true_case() = simplify_pointer_offset(if_expr.true_case());
245245
if_expr.false_case() = simplify_pointer_offset(if_expr.false_case());
246-
simplify_if(if_expr);
247-
return if_expr;
246+
return changed(simplify_if(if_expr));
248247
}
249248

250249
if(ptr.type().id()!=ID_pointer)
@@ -577,8 +576,7 @@ simplify_exprt::simplify_is_dynamic_object(const exprt &expr)
577576
if_exprt if_expr=lift_if(expr, 0);
578577
if_expr.true_case() = simplify_is_dynamic_object(if_expr.true_case());
579578
if_expr.false_case() = simplify_is_dynamic_object(if_expr.false_case());
580-
simplify_if(if_expr);
581-
return std::move(if_expr);
579+
return changed(simplify_if(if_expr));
582580
}
583581

584582
bool no_change = true;

0 commit comments

Comments
 (0)