Skip to content

Commit d988fb1

Browse files
committed
simplify pointer_offset(element_address(Z, y))
1 parent dad8ceb commit d988fb1

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

src/cprover/simplify_state_expr.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)