@@ -657,49 +657,40 @@ static exprt lower_byte_update(
657
657
// byte array?
658
658
if (sub_size==1 )
659
659
{
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
+
660
674
// apply 'array-update-with' element_size times
661
675
exprt result=src.op0 ();
662
676
663
- for (mp_integer i=0 ; i<element_size; ++i)
677
+ std::size_t i = 0 ;
678
+ for (const auto &element : new_value.operands ())
664
679
{
665
680
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;
690
682
691
683
const exprt where = simplify_expr (plus_exprt (src.op1 (), i_expr), ns);
692
684
693
685
// skip elements that wouldn't change
694
- if (new_value .id () == ID_index)
686
+ if (element .id () == ID_index)
695
687
{
696
- const index_exprt &index_expr = to_index_expr (new_value );
688
+ const index_exprt &index_expr = to_index_expr (element );
697
689
if (index_expr.array () == src.op0 () && index_expr.index () == where)
698
690
continue ;
699
691
}
700
692
701
- with_exprt with_expr (result, where, new_value);
702
- with_expr.type ()=src.type ();
693
+ with_exprt with_expr (result, where, element);
703
694
704
695
result.swap (with_expr);
705
696
}
0 commit comments