Skip to content

Commit 58d3969

Browse files
committed
Optimise byte_update lowering
In the case of updates to a byte array do just a single translation of the update value to an array of bytes.
1 parent efca39b commit 58d3969

File tree

1 file changed

+20
-29
lines changed

1 file changed

+20
-29
lines changed

src/solvers/lowering/byte_operators.cpp

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -657,49 +657,40 @@ static exprt lower_byte_update(
657657
// byte array?
658658
if(sub_size==1)
659659
{
660+
byte_extract_exprt byte_extract_expr(
661+
src.id()==ID_byte_update_little_endian?
662+
ID_byte_extract_little_endian:
663+
src.id()==ID_byte_update_big_endian?
664+
ID_byte_extract_big_endian:
665+
throw "unexpected src.id() in lower_byte_update",
666+
src.op2(),
667+
from_integer(0, src.op1().type()),
668+
array_typet(subtype, from_integer(element_size, size_type())));
669+
670+
array_exprt new_value =
671+
to_array_expr(lower_byte_extract(byte_extract_expr, ns));
672+
CHECK_RETURN(new_value.operands().size() == element_size);
673+
660674
// apply 'array-update-with' element_size times
661675
exprt result=src.op0();
662676

663-
for(mp_integer i=0; i<element_size; ++i)
677+
std::size_t i = 0;
678+
for(const auto &element : new_value.operands())
664679
{
665680
exprt i_expr=from_integer(i, ns.follow(src.op1().type()));
666-
667-
exprt new_value;
668-
669-
if(i==0 && element_size==1) // bytes?
670-
{
671-
new_value=src.op2();
672-
if(new_value.type()!=subtype)
673-
new_value.make_typecast(subtype);
674-
}
675-
else
676-
{
677-
byte_extract_exprt byte_extract_expr(
678-
src.id()==ID_byte_update_little_endian?
679-
ID_byte_extract_little_endian:
680-
src.id()==ID_byte_update_big_endian?
681-
ID_byte_extract_big_endian:
682-
throw "unexpected src.id() in lower_byte_update",
683-
subtype);
684-
685-
byte_extract_expr.op()=src.op2();
686-
byte_extract_expr.offset()=i_expr;
687-
688-
new_value=lower_byte_extract(byte_extract_expr, ns);
689-
}
681+
++i;
690682

691683
const exprt where = simplify_expr(plus_exprt(src.op1(), i_expr), ns);
692684

693685
// skip elements that wouldn't change
694-
if(new_value.id() == ID_index)
686+
if(element.id() == ID_index)
695687
{
696-
const index_exprt &index_expr = to_index_expr(new_value);
688+
const index_exprt &index_expr = to_index_expr(element);
697689
if(index_expr.array() == src.op0() && index_expr.index() == where)
698690
continue;
699691
}
700692

701-
with_exprt with_expr(result, where, new_value);
702-
with_expr.type()=src.type();
693+
with_exprt with_expr(result, where, element);
703694

704695
result.swap(with_expr);
705696
}

0 commit comments

Comments
 (0)