@@ -1376,23 +1376,6 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
1376
1376
if (pointer.type ().id ()!=ID_pointer)
1377
1377
return unchanged (expr);
1378
1378
1379
- if (pointer.id ()==ID_if && pointer.operands ().size ()==3 )
1380
- {
1381
- const if_exprt &if_expr=to_if_expr (pointer);
1382
-
1383
- auto tmp_op1 = expr;
1384
- tmp_op1.op () = if_expr.true_case ();
1385
- exprt tmp_op1_result = simplify_dereference (tmp_op1);
1386
-
1387
- auto tmp_op2 = expr;
1388
- tmp_op2.op () = if_expr.false_case ();
1389
- exprt tmp_op2_result = simplify_dereference (tmp_op2);
1390
-
1391
- if_exprt tmp{if_expr.cond (), tmp_op1_result, tmp_op2_result};
1392
-
1393
- return changed (simplify_if (tmp));
1394
- }
1395
-
1396
1379
if (pointer.id ()==ID_address_of)
1397
1380
{
1398
1381
exprt tmp=to_address_of_expr (pointer).object ();
@@ -1426,6 +1409,30 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
1426
1409
return unchanged (expr);
1427
1410
}
1428
1411
1412
+ simplify_exprt::resultt<>
1413
+ simplify_exprt::simplify_dereference_preorder (const dereference_exprt &expr)
1414
+ {
1415
+ const exprt &pointer = expr.pointer ();
1416
+
1417
+ if (pointer.id () == ID_if)
1418
+ {
1419
+ if_exprt if_expr = lift_if (expr, 0 );
1420
+ return changed (simplify_if_preorder (if_expr));
1421
+ }
1422
+ else
1423
+ {
1424
+ auto r_it = simplify_rec (pointer); // recursive call
1425
+ if (r_it.has_changed ())
1426
+ {
1427
+ auto tmp = expr;
1428
+ tmp.pointer () = r_it.expr ;
1429
+ return tmp;
1430
+ }
1431
+ }
1432
+
1433
+ return unchanged (expr);
1434
+ }
1435
+
1429
1436
simplify_exprt::resultt<>
1430
1437
simplify_exprt::simplify_lambda (const lambda_exprt &expr)
1431
1438
{
@@ -1642,17 +1649,6 @@ simplify_exprt::resultt<> simplify_exprt::simplify_object(const exprt &expr)
1642
1649
simplify_exprt::resultt<>
1643
1650
simplify_exprt::simplify_byte_extract (const byte_extract_exprt &expr)
1644
1651
{
1645
- // lift up any ID_if on the object
1646
- if (expr.op ().id ()==ID_if)
1647
- {
1648
- if_exprt if_expr=lift_if (expr, 0 );
1649
- if_expr.true_case () =
1650
- simplify_byte_extract (to_byte_extract_expr (if_expr.true_case ()));
1651
- if_expr.false_case () =
1652
- simplify_byte_extract (to_byte_extract_expr (if_expr.false_case ()));
1653
- return changed (simplify_if (if_expr));
1654
- }
1655
-
1656
1652
const auto el_size = pointer_offset_bits (expr.type (), ns);
1657
1653
if (el_size.has_value () && *el_size < 0 )
1658
1654
return unchanged (expr);
@@ -1995,6 +1991,41 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
1995
1991
return unchanged (expr);
1996
1992
}
1997
1993
1994
+ simplify_exprt::resultt<>
1995
+ simplify_exprt::simplify_byte_extract_preorder (const byte_extract_exprt &expr)
1996
+ {
1997
+ // lift up any ID_if on the object
1998
+ if (expr.op ().id () == ID_if)
1999
+ {
2000
+ if_exprt if_expr = lift_if (expr, 0 );
2001
+ return changed (simplify_if_preorder (if_expr));
2002
+ }
2003
+ else
2004
+ {
2005
+ optionalt<exprt::operandst> new_operands;
2006
+
2007
+ for (std::size_t i = 0 ; i < expr.operands ().size (); ++i)
2008
+ {
2009
+ auto r_it = simplify_rec (expr.operands ()[i]); // recursive call
2010
+ if (r_it.has_changed ())
2011
+ {
2012
+ if (!new_operands.has_value ())
2013
+ new_operands = expr.operands ();
2014
+ (*new_operands)[i] = std::move (r_it.expr );
2015
+ }
2016
+ }
2017
+
2018
+ if (new_operands.has_value ())
2019
+ {
2020
+ exprt result = expr;
2021
+ std::swap (result.operands (), *new_operands);
2022
+ return result;
2023
+ }
2024
+ }
2025
+
2026
+ return unchanged (expr);
2027
+ }
2028
+
1998
2029
simplify_exprt::resultt<>
1999
2030
simplify_exprt::simplify_byte_update (const byte_update_exprt &expr)
2000
2031
{
@@ -2724,6 +2755,31 @@ simplify_exprt::simplify_node_preorder(const exprt &expr)
2724
2755
{
2725
2756
result = simplify_typecast_preorder (to_typecast_expr (expr));
2726
2757
}
2758
+ else if (
2759
+ expr.id () == ID_byte_extract_little_endian ||
2760
+ expr.id () == ID_byte_extract_big_endian)
2761
+ {
2762
+ result = simplify_byte_extract_preorder (to_byte_extract_expr (expr));
2763
+ }
2764
+ else if (expr.id () == ID_dereference)
2765
+ {
2766
+ result = simplify_dereference_preorder (to_dereference_expr (expr));
2767
+ }
2768
+ else if (expr.id () == ID_index)
2769
+ {
2770
+ result = simplify_index_preorder (to_index_expr (expr));
2771
+ }
2772
+ else if (expr.id () == ID_member)
2773
+ {
2774
+ result = simplify_member_preorder (to_member_expr (expr));
2775
+ }
2776
+ else if (
2777
+ expr.id () == ID_is_dynamic_object || expr.id () == ID_is_invalid_pointer ||
2778
+ expr.id () == ID_object_size || expr.id () == ID_pointer_object ||
2779
+ expr.id () == ID_pointer_offset)
2780
+ {
2781
+ result = simplify_unary_pointer_predicate_preorder (to_unary_expr (expr));
2782
+ }
2727
2783
else if (expr.has_operands ())
2728
2784
{
2729
2785
optionalt<exprt::operandst> new_operands;
0 commit comments