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