@@ -579,18 +579,19 @@ exprt simplify_state_expr_node(
579579 {
580580 const auto &element_address_expr =
581581 to_element_address_expr (pointer_offset_expr.pointer ());
582- if (element_address_expr.base ().id () == ID_object_address)
582+ // pointer_offset(element_address(Z, y)) -->
583+ // pointer_offset(Z) + y*sizeof(x)
584+ auto size_opt = size_of_expr (element_address_expr.element_type (), ns);
585+ if (size_opt.has_value ())
583586 {
584- // pointer_offset(element_address(❝x❞, y)) -> y*sizeof(x)
585- auto size_opt = size_of_expr (element_address_expr.element_type (), ns);
586- if (size_opt.has_value ())
587- {
588- auto product = mult_exprt (
589- typecast_exprt::conditional_cast (
590- element_address_expr.index (), src.type ()),
591- typecast_exprt::conditional_cast (*size_opt, src.type ()));
592- return std::move (product);
593- }
587+ auto product = mult_exprt (
588+ typecast_exprt::conditional_cast (
589+ element_address_expr.index (), src.type ()),
590+ typecast_exprt::conditional_cast (*size_opt, src.type ()));
591+ auto pointer_offset = pointer_offset_exprt (
592+ element_address_expr.base (), pointer_offset_expr.type ());
593+ auto sum = plus_exprt (pointer_offset, std::move (product));
594+ return std::move (sum);
594595 }
595596 }
596597 }
0 commit comments