@@ -795,7 +795,8 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
795
795
auto one = from_integer (1 , expr_type);
796
796
auto zero = from_integer (0 , expr_type);
797
797
exprt new_expr = if_exprt (expr.op (), std::move (one), std::move (zero));
798
- return changed (simplify_rec (new_expr)); // recursive call
798
+ simplify_if_preorder (to_if_expr (new_expr));
799
+ return new_expr;
799
800
}
800
801
801
802
// circular casts through types shorter than `int`
@@ -884,16 +885,17 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
884
885
if (sub_size.has_value ())
885
886
{
886
887
auto new_expr = expr;
888
+ exprt offset_expr =
889
+ simplify_typecast (typecast_exprt (op_plus_expr.op1 (), size_type ()));
887
890
888
891
// void*
889
892
if (*sub_size == 0 || *sub_size == 1 )
890
- new_expr.op () = typecast_exprt (op_plus_expr. op1 (), size_type ()) ;
893
+ new_expr.op () = offset_expr ;
891
894
else
892
- new_expr.op () = mult_exprt (
893
- from_integer (*sub_size, size_type ()),
894
- typecast_exprt (op_plus_expr.op1 (), size_type ()));
895
-
896
- new_expr.op () = simplify_rec (new_expr.op ()); // rec. call
895
+ {
896
+ new_expr.op () = simplify_mult (
897
+ mult_exprt (from_integer (*sub_size, size_type ()), offset_expr));
898
+ }
897
899
898
900
return changed (simplify_typecast (new_expr)); // rec. call
899
901
}
@@ -965,19 +967,18 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
965
967
966
968
for (auto &op : new_expr.op ().operands ())
967
969
{
968
- if (op.type ().id ()==ID_pointer)
970
+ exprt new_op = simplify_typecast (typecast_exprt (op, size_t_type));
971
+ if (op.type ().id () != ID_pointer && *step > 1 )
969
972
{
970
- op = typecast_exprt (op, size_t_type);
971
- }
972
- else
973
- {
974
- op = typecast_exprt (op, size_t_type);
975
- if (*step > 1 )
976
- op = mult_exprt (from_integer (*step, size_t_type), op);
973
+ new_op =
974
+ simplify_mult (mult_exprt (from_integer (*step, size_t_type), new_op));
977
975
}
976
+ op = std::move (new_op);
978
977
}
979
978
980
- return changed (simplify_rec (new_expr)); // recursive call
979
+ new_expr.op () = simplify_plus (to_plus_expr (new_expr.op ()));
980
+
981
+ return changed (simplify_typecast (new_expr)); // recursive call
981
982
}
982
983
}
983
984
@@ -1316,7 +1317,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
1316
1317
auto result =
1317
1318
address_of_exprt (index_exprt (o, from_integer (0 , size_type ())));
1318
1319
1319
- return changed (simplify_rec (result)); // recursive call
1320
+ return changed (simplify_address_of (result)); // recursive call
1320
1321
}
1321
1322
}
1322
1323
@@ -1723,9 +1724,9 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
1723
1724
pointer_offset_bits (to_array_of_expr (expr.op ()).what ().type (), ns))
1724
1725
{
1725
1726
auto tmp = expr;
1726
- tmp.op () = index_exprt (expr.op (), expr.offset ());
1727
+ tmp.op () = simplify_index ( index_exprt (expr.op (), expr.offset () ));
1727
1728
tmp.offset () = from_integer (0 , expr.offset ().type ());
1728
- return changed (simplify_rec (tmp));
1729
+ return changed (simplify_byte_extract (tmp));
1729
1730
}
1730
1731
1731
1732
// extract bits of a constant
@@ -1970,19 +1971,19 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
1970
1971
{
1971
1972
const exprt &index =with.where ();
1972
1973
exprt index_offset =
1973
- simplify_node (mult_exprt (index , from_integer (*i, index .type ())));
1974
+ simplify_mult (mult_exprt (index , from_integer (*i, index .type ())));
1974
1975
1975
1976
// index_offset may need a typecast
1976
1977
if (offset.type () != index .type ())
1977
1978
{
1978
1979
index_offset =
1979
- simplify_node (typecast_exprt (index_offset, offset.type ()));
1980
+ simplify_typecast (typecast_exprt (index_offset, offset.type ()));
1980
1981
}
1981
1982
1982
1983
plus_exprt new_offset (offset, index_offset);
1983
1984
exprt new_value (with.new_value ());
1984
1985
auto tmp = expr;
1985
- tmp.set_offset (simplify_node (std::move (new_offset)));
1986
+ tmp.set_offset (simplify_plus (std::move (new_offset)));
1986
1987
tmp.set_value (std::move (new_value));
1987
1988
return changed (simplify_byte_update (tmp)); // recursive call
1988
1989
}
0 commit comments