@@ -991,9 +991,7 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
991
991
992
992
if_exprt tmp{if_expr.cond (), tmp_op1_result, tmp_op2_result};
993
993
994
- simplify_if (tmp);
995
-
996
- return tmp;
994
+ return changed (simplify_if (tmp));
997
995
}
998
996
999
997
if (pointer.id ()==ID_address_of)
@@ -1311,13 +1309,12 @@ bool simplify_exprt::simplify_if_preorder(if_exprt &expr)
1311
1309
return result;
1312
1310
}
1313
1311
1314
- bool simplify_exprt::simplify_if (if_exprt &expr)
1312
+ NODISCARD simplify_exprt::resultt<>
1313
+ simplify_exprt::simplify_if (const if_exprt &expr)
1315
1314
{
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 ();
1321
1318
1322
1319
if (do_simplify_if)
1323
1320
{
@@ -1333,26 +1330,21 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
1333
1330
if (truevalue.is_true () && falsevalue.is_false ())
1334
1331
{
1335
1332
// a?1:0 <-> a
1336
- exprt tmp;
1337
- tmp.swap (cond);
1338
- expr.swap (tmp);
1339
- return false ;
1333
+ return cond;
1340
1334
}
1341
1335
else if (truevalue.is_false () && falsevalue.is_true ())
1342
1336
{
1343
1337
// a?0:1 <-> !a
1344
1338
exprt tmp = boolean_negate (cond);
1345
1339
simplify_node (tmp);
1346
- expr.swap (tmp);
1347
- return false ;
1340
+ return std::move (tmp);
1348
1341
}
1349
1342
else if (falsevalue.is_false ())
1350
1343
{
1351
1344
// a?b:0 <-> a AND b
1352
1345
and_exprt tmp (cond, truevalue);
1353
1346
simplify_node (tmp);
1354
- expr.swap (tmp);
1355
- return false ;
1347
+ return std::move (tmp);
1356
1348
}
1357
1349
else if (falsevalue.is_true ())
1358
1350
{
@@ -1361,16 +1353,14 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
1361
1353
simplify_node (tmp_not_cond);
1362
1354
or_exprt tmp (tmp_not_cond, truevalue);
1363
1355
simplify_node (tmp);
1364
- expr.swap (tmp);
1365
- return false ;
1356
+ return std::move (tmp);
1366
1357
}
1367
1358
else if (truevalue.is_true ())
1368
1359
{
1369
1360
// a?1:b <-> a||(!a && b) <-> a OR b
1370
1361
or_exprt tmp (cond, falsevalue);
1371
1362
simplify_node (tmp);
1372
- expr.swap (tmp);
1373
- return false ;
1363
+ return std::move (tmp);
1374
1364
}
1375
1365
else if (truevalue.is_false ())
1376
1366
{
@@ -1379,19 +1369,13 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
1379
1369
simplify_node (tmp_not_cond);
1380
1370
and_exprt tmp (tmp_not_cond, falsevalue);
1381
1371
simplify_node (tmp);
1382
- expr.swap (tmp);
1383
- return false ;
1372
+ return std::move (tmp);
1384
1373
}
1385
1374
}
1386
1375
}
1387
1376
1388
1377
if (truevalue==falsevalue)
1389
- {
1390
- exprt tmp;
1391
- tmp.swap (truevalue);
1392
- expr.swap (tmp);
1393
- return false ;
1394
- }
1378
+ return truevalue;
1395
1379
1396
1380
// this pushes the if-then-else into struct and array constructors
1397
1381
if (((truevalue.id ()==ID_struct && falsevalue.id ()==ID_struct) ||
@@ -1409,17 +1393,14 @@ bool simplify_exprt::simplify_if(if_exprt &expr)
1409
1393
1410
1394
for (const auto &pair : range_true.zip (range_false))
1411
1395
{
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 )));
1415
1398
}
1416
1399
1417
- expr.swap (new_expr);
1418
-
1419
- return false ;
1400
+ return std::move (new_expr);
1420
1401
}
1421
1402
1422
- return result ;
1403
+ return unchanged (expr) ;
1423
1404
}
1424
1405
1425
1406
bool simplify_exprt::get_values (
@@ -1994,8 +1975,7 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
1994
1975
simplify_byte_extract (to_byte_extract_expr (if_expr.true_case ()));
1995
1976
if_expr.false_case () =
1996
1977
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);
1999
1979
}
2000
1980
2001
1981
const auto el_size = pointer_offset_bits (expr.type (), ns);
@@ -2523,7 +2503,14 @@ bool simplify_exprt::simplify_node(exprt &expr)
2523
2503
expr.id ()==ID_ge || expr.id ()==ID_le)
2524
2504
no_change = simplify_inequality (expr) && no_change;
2525
2505
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
+ }
2527
2514
else if (expr.id ()==ID_lambda)
2528
2515
no_change = simplify_lambda (expr) && no_change;
2529
2516
else if (expr.id ()==ID_with)
0 commit comments