@@ -1376,23 +1376,6 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
13761376 if (pointer.type ().id ()!=ID_pointer)
13771377 return unchanged (expr);
13781378
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-
13961379 if (pointer.id ()==ID_address_of)
13971380 {
13981381 exprt tmp=to_address_of_expr (pointer).object ();
@@ -1426,6 +1409,30 @@ simplify_exprt::simplify_dereference(const dereference_exprt &expr)
14261409 return unchanged (expr);
14271410}
14281411
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+
14291436simplify_exprt::resultt<>
14301437simplify_exprt::simplify_lambda (const lambda_exprt &expr)
14311438{
@@ -1642,17 +1649,6 @@ simplify_exprt::resultt<> simplify_exprt::simplify_object(const exprt &expr)
16421649simplify_exprt::resultt<>
16431650simplify_exprt::simplify_byte_extract (const byte_extract_exprt &expr)
16441651{
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-
16561652 const auto el_size = pointer_offset_bits (expr.type (), ns);
16571653 if (el_size.has_value () && *el_size < 0 )
16581654 return unchanged (expr);
@@ -2010,6 +2006,41 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
20102006 return unchanged (expr);
20112007}
20122008
2009+ simplify_exprt::resultt<>
2010+ simplify_exprt::simplify_byte_extract_preorder (const byte_extract_exprt &expr)
2011+ {
2012+ // lift up any ID_if on the object
2013+ if (expr.op ().id () == ID_if)
2014+ {
2015+ if_exprt if_expr = lift_if (expr, 0 );
2016+ return changed (simplify_if_preorder (if_expr));
2017+ }
2018+ else
2019+ {
2020+ optionalt<exprt::operandst> new_operands;
2021+
2022+ for (std::size_t i = 0 ; i < expr.operands ().size (); ++i)
2023+ {
2024+ auto r_it = simplify_rec (expr.operands ()[i]); // recursive call
2025+ if (r_it.has_changed ())
2026+ {
2027+ if (!new_operands.has_value ())
2028+ new_operands = expr.operands ();
2029+ (*new_operands)[i] = std::move (r_it.expr );
2030+ }
2031+ }
2032+
2033+ if (new_operands.has_value ())
2034+ {
2035+ exprt result = expr;
2036+ std::swap (result.operands (), *new_operands);
2037+ return result;
2038+ }
2039+ }
2040+
2041+ return unchanged (expr);
2042+ }
2043+
20132044simplify_exprt::resultt<>
20142045simplify_exprt::simplify_byte_update (const byte_update_exprt &expr)
20152046{
@@ -2739,6 +2770,31 @@ simplify_exprt::simplify_node_preorder(const exprt &expr)
27392770 {
27402771 result = simplify_typecast_preorder (to_typecast_expr (expr));
27412772 }
2773+ else if (
2774+ expr.id () == ID_byte_extract_little_endian ||
2775+ expr.id () == ID_byte_extract_big_endian)
2776+ {
2777+ result = simplify_byte_extract_preorder (to_byte_extract_expr (expr));
2778+ }
2779+ else if (expr.id () == ID_dereference)
2780+ {
2781+ result = simplify_dereference_preorder (to_dereference_expr (expr));
2782+ }
2783+ else if (expr.id () == ID_index)
2784+ {
2785+ result = simplify_index_preorder (to_index_expr (expr));
2786+ }
2787+ else if (expr.id () == ID_member)
2788+ {
2789+ result = simplify_member_preorder (to_member_expr (expr));
2790+ }
2791+ else if (
2792+ expr.id () == ID_is_dynamic_object || expr.id () == ID_is_invalid_pointer ||
2793+ expr.id () == ID_object_size || expr.id () == ID_pointer_object ||
2794+ expr.id () == ID_pointer_offset)
2795+ {
2796+ result = simplify_unary_pointer_predicate_preorder (to_unary_expr (expr));
2797+ }
27422798 else if (expr.has_operands ())
27432799 {
27442800 optionalt<exprt::operandst> new_operands;
0 commit comments