Skip to content

Commit a1f0dc7

Browse files
authored
Merge pull request #4865 from diffblue/simpliy_if_new_interface
Simplifier: simplify_if new interface
2 parents b41cc10 + f936554 commit a1f0dc7

File tree

5 files changed

+41
-57
lines changed

5 files changed

+41
-57
lines changed

src/util/simplify_expr.cpp

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Author: Daniel Kroening, kroening@kroening.com
2222
#include "namespace.h"
2323
#include "pointer_offset_size.h"
2424
#include "pointer_offset_sum.h"
25+
#include "range.h"
2526
#include "rational.h"
2627
#include "rational_tools.h"
2728
#include "simplify_utils.h"
@@ -990,9 +991,7 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
990991

991992
if_exprt tmp{if_expr.cond(), tmp_op1_result, tmp_op2_result};
992993

993-
simplify_if(tmp);
994-
995-
return tmp;
994+
return changed(simplify_if(tmp));
996995
}
997996

998997
if(pointer.id()==ID_address_of)
@@ -1310,13 +1309,12 @@ bool simplify_exprt::simplify_if_preorder(if_exprt &expr)
13101309
return result;
13111310
}
13121311

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

13211319
if(do_simplify_if)
13221320
{
@@ -1332,26 +1330,21 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13321330
if(truevalue.is_true() && falsevalue.is_false())
13331331
{
13341332
// a?1:0 <-> a
1335-
exprt tmp;
1336-
tmp.swap(cond);
1337-
expr.swap(tmp);
1338-
return false;
1333+
return cond;
13391334
}
13401335
else if(truevalue.is_false() && falsevalue.is_true())
13411336
{
13421337
// a?0:1 <-> !a
13431338
exprt tmp = boolean_negate(cond);
13441339
simplify_node(tmp);
1345-
expr.swap(tmp);
1346-
return false;
1340+
return std::move(tmp);
13471341
}
13481342
else if(falsevalue.is_false())
13491343
{
13501344
// a?b:0 <-> a AND b
13511345
and_exprt tmp(cond, truevalue);
13521346
simplify_node(tmp);
1353-
expr.swap(tmp);
1354-
return false;
1347+
return std::move(tmp);
13551348
}
13561349
else if(falsevalue.is_true())
13571350
{
@@ -1360,16 +1353,14 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13601353
simplify_node(tmp_not_cond);
13611354
or_exprt tmp(tmp_not_cond, truevalue);
13621355
simplify_node(tmp);
1363-
expr.swap(tmp);
1364-
return false;
1356+
return std::move(tmp);
13651357
}
13661358
else if(truevalue.is_true())
13671359
{
13681360
// a?1:b <-> a||(!a && b) <-> a OR b
13691361
or_exprt tmp(cond, falsevalue);
13701362
simplify_node(tmp);
1371-
expr.swap(tmp);
1372-
return false;
1363+
return std::move(tmp);
13731364
}
13741365
else if(truevalue.is_false())
13751366
{
@@ -1378,42 +1369,38 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
13781369
simplify_node(tmp_not_cond);
13791370
and_exprt tmp(tmp_not_cond, falsevalue);
13801371
simplify_node(tmp);
1381-
expr.swap(tmp);
1382-
return false;
1372+
return std::move(tmp);
13831373
}
13841374
}
13851375
}
13861376

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

1380+
// this pushes the if-then-else into struct and array constructors
13951381
if(((truevalue.id()==ID_struct && falsevalue.id()==ID_struct) ||
13961382
(truevalue.id()==ID_array && falsevalue.id()==ID_array)) &&
13971383
truevalue.operands().size()==falsevalue.operands().size())
13981384
{
13991385
exprt cond_copy=cond;
14001386
exprt falsevalue_copy=falsevalue;
1401-
expr.swap(truevalue);
1387+
exprt truevalue_copy = truevalue;
1388+
1389+
auto range_false = make_range(falsevalue_copy.operands());
1390+
auto range_true = make_range(truevalue_copy.operands());
1391+
auto new_expr = truevalue;
1392+
new_expr.operands().clear();
14021393

1403-
exprt::operandst::const_iterator f_it=
1404-
falsevalue_copy.operands().begin();
1405-
Forall_operands(it, expr)
1394+
for(const auto &pair : range_true.zip(range_false))
14061395
{
1407-
if_exprt if_expr(cond_copy, *it, *f_it);
1408-
it->swap(if_expr);
1409-
simplify_if(to_if_expr(*it));
1410-
++f_it;
1396+
new_expr.operands().push_back(
1397+
simplify_if(if_exprt(cond_copy, pair.first, pair.second)));
14111398
}
14121399

1413-
return false;
1400+
return std::move(new_expr);
14141401
}
14151402

1416-
return result;
1403+
return unchanged(expr);
14171404
}
14181405

14191406
bool simplify_exprt::get_values(
@@ -1988,8 +1975,7 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
19881975
simplify_byte_extract(to_byte_extract_expr(if_expr.true_case()));
19891976
if_expr.false_case() =
19901977
simplify_byte_extract(to_byte_extract_expr(if_expr.false_case()));
1991-
simplify_if(if_expr);
1992-
return std::move(if_expr);
1978+
return simplify_if(if_expr);
19931979
}
19941980

19951981
const auto el_size = pointer_offset_bits(expr.type(), ns);
@@ -2517,7 +2503,14 @@ bool simplify_exprt::simplify_node(exprt &expr)
25172503
expr.id()==ID_ge || expr.id()==ID_le)
25182504
no_change = simplify_inequality(expr) && no_change;
25192505
else if(expr.id()==ID_if)
2520-
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+
}
25212514
else if(expr.id()==ID_lambda)
25222515
no_change = simplify_lambda(expr) && no_change;
25232516
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)