Skip to content

Commit 08f1a9e

Browse files
committed
Extract elements of array, struct directly instead of simplifying
vectors don't need to be handled, they have been removed via remove_vector.
1 parent 879a47b commit 08f1a9e

File tree

1 file changed

+44
-34
lines changed

1 file changed

+44
-34
lines changed

src/path-symex/path_symex.cpp

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -549,14 +549,30 @@ void path_symext::assign_rec(
549549

550550
assert(operands.size()==components.size());
551551

552-
for(std::size_t i=0; i<components.size(); i++)
552+
if(ssa_rhs.id()==ID_struct &&
553+
ssa_rhs.operands().size()==components.size())
553554
{
554-
exprt new_rhs=
555-
ssa_rhs.is_nil()?ssa_rhs:
556-
simplify_expr(
557-
member_exprt(ssa_rhs, components[i].get_name(), components[i].type()),
558-
state.var_map.ns);
559-
assign_rec(state, guard, operands[i], new_rhs);
555+
exprt::operandst::const_iterator lhs_it=operands.begin();
556+
forall_operands(it, ssa_rhs)
557+
{
558+
assign_rec(state, guard, *lhs_it, *it);
559+
++lhs_it;
560+
}
561+
}
562+
else
563+
{
564+
for(std::size_t i=0; i<components.size(); i++)
565+
{
566+
exprt new_rhs=
567+
ssa_rhs.is_nil()?ssa_rhs:
568+
simplify_expr(
569+
member_exprt(
570+
ssa_rhs,
571+
components[i].get_name(),
572+
components[i].type()),
573+
state.var_map.ns);
574+
assign_rec(state, guard, operands[i], new_rhs);
575+
}
560576
}
561577
}
562578
else if(ssa_lhs.id()==ID_array)
@@ -572,36 +588,30 @@ void path_symext::assign_rec(
572588
const exprt::operandst &operands=ssa_lhs.operands();
573589

574590
// split up into elements
575-
for(std::size_t i=0; i<operands.size(); i++)
591+
if(ssa_rhs.id()==ID_array &&
592+
ssa_rhs.operands().size()==operands.size())
576593
{
577-
exprt new_rhs=
578-
ssa_rhs.is_nil()?ssa_rhs:
579-
simplify_expr(
580-
index_exprt(
581-
ssa_rhs,
582-
from_integer(i, index_type()), array_type.subtype()),
583-
state.var_map.ns);
584-
assign_rec(state, guard, operands[i], new_rhs);
594+
exprt::operandst::const_iterator lhs_it=operands.begin();
595+
forall_operands(it, ssa_rhs)
596+
{
597+
assign_rec(state, guard, *lhs_it, *it);
598+
++lhs_it;
599+
}
585600
}
586-
}
587-
else if(ssa_lhs.id()==ID_vector)
588-
{
589-
const vector_typet &vector_type=
590-
to_vector_type(state.var_map.ns.follow(ssa_lhs.type()));
591-
592-
const exprt::operandst &operands=ssa_lhs.operands();
593-
594-
// split up into elements
595-
for(std::size_t i=0; i<operands.size(); i++)
601+
else
596602
{
597-
exprt new_rhs=
598-
ssa_rhs.is_nil()?ssa_rhs:
599-
simplify_expr(
600-
index_exprt(
601-
ssa_rhs,
602-
from_integer(i, index_type()), vector_type.subtype()),
603-
state.var_map.ns);
604-
assign_rec(state, guard, operands[i], new_rhs);
603+
for(std::size_t i=0; i<operands.size(); i++)
604+
{
605+
exprt new_rhs=
606+
ssa_rhs.is_nil()?ssa_rhs:
607+
simplify_expr(
608+
index_exprt(
609+
ssa_rhs,
610+
from_integer(i, index_type()),
611+
array_type.subtype()),
612+
state.var_map.ns);
613+
assign_rec(state, guard, operands[i], new_rhs);
614+
}
605615
}
606616
}
607617
else if(ssa_lhs.id()==ID_string_constant ||

0 commit comments

Comments
 (0)