@@ -795,7 +795,8 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
795795 auto one = from_integer (1 , expr_type);
796796 auto zero = from_integer (0 , expr_type);
797797 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;
799800 }
800801
801802 // circular casts through types shorter than `int`
@@ -884,16 +885,17 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
884885 if (sub_size.has_value ())
885886 {
886887 auto new_expr = expr;
888+ exprt offset_expr =
889+ simplify_typecast (typecast_exprt (op_plus_expr.op1 (), size_type ()));
887890
888891 // void*
889892 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 ;
891894 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+ }
897899
898900 return changed (simplify_typecast (new_expr)); // rec. call
899901 }
@@ -965,19 +967,18 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
965967
966968 for (auto &op : new_expr.op ().operands ())
967969 {
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 )
969972 {
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));
977975 }
976+ op = std::move (new_op);
978977 }
979978
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
981982 }
982983 }
983984
@@ -1316,7 +1317,7 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
13161317 auto result =
13171318 address_of_exprt (index_exprt (o, from_integer (0 , size_type ())));
13181319
1319- return changed (simplify_rec (result)); // recursive call
1320+ return changed (simplify_address_of (result)); // recursive call
13201321 }
13211322 }
13221323
@@ -1723,9 +1724,9 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
17231724 pointer_offset_bits (to_array_of_expr (expr.op ()).what ().type (), ns))
17241725 {
17251726 auto tmp = expr;
1726- tmp.op () = index_exprt (expr.op (), expr.offset ());
1727+ tmp.op () = simplify_index ( index_exprt (expr.op (), expr.offset () ));
17271728 tmp.offset () = from_integer (0 , expr.offset ().type ());
1728- return changed (simplify_rec (tmp));
1729+ return changed (simplify_byte_extract (tmp));
17291730 }
17301731
17311732 // extract bits of a constant
@@ -1905,19 +1906,19 @@ simplify_exprt::simplify_byte_update(const byte_update_exprt &expr)
19051906 {
19061907 const exprt &index=with.where ();
19071908 exprt index_offset =
1908- simplify_node (mult_exprt (index, from_integer (*i, index.type ())));
1909+ simplify_mult (mult_exprt (index, from_integer (*i, index.type ())));
19091910
19101911 // index_offset may need a typecast
19111912 if (offset.type () != index.type ())
19121913 {
19131914 index_offset =
1914- simplify_node (typecast_exprt (index_offset, offset.type ()));
1915+ simplify_typecast (typecast_exprt (index_offset, offset.type ()));
19151916 }
19161917
19171918 plus_exprt new_offset (offset, index_offset);
19181919 exprt new_value (with.new_value ());
19191920 auto tmp = expr;
1920- tmp.set_offset (simplify_node (std::move (new_offset)));
1921+ tmp.set_offset (simplify_plus (std::move (new_offset)));
19211922 tmp.set_value (std::move (new_value));
19221923 return changed (simplify_byte_update (tmp)); // recursive call
19231924 }
0 commit comments