@@ -628,7 +628,13 @@ static exprt lower_byte_update(
628
628
const namespacet &ns,
629
629
bool negative_offset)
630
630
{
631
- assert (src.operands ().size ()==3 );
631
+ DATA_INVARIANT (
632
+ src.id () == ID_byte_update_little_endian ||
633
+ src.id () == ID_byte_update_big_endian,
634
+ " byte_update with unknown id " + src.id_string ());
635
+
636
+ const irep_idt extract_opcode = src.id () == ID_byte_update_little_endian
637
+ ? ID_byte_extract_little_endian : ID_byte_extract_big_endian;
632
638
633
639
mp_integer element_size=
634
640
pointer_offset_size (src.op2 ().type (), ns);
@@ -657,49 +663,36 @@ static exprt lower_byte_update(
657
663
// byte array?
658
664
if (sub_size==1 )
659
665
{
666
+ byte_extract_exprt byte_extract_expr (
667
+ extract_opcode,
668
+ src.op2 (),
669
+ from_integer (0 , src.op1 ().type ()),
670
+ array_typet (subtype, from_integer (element_size, size_type ())));
671
+
672
+ array_exprt new_value =
673
+ to_array_expr (lower_byte_extract (byte_extract_expr, ns));
674
+ CHECK_RETURN (new_value.operands ().size () == element_size);
675
+
660
676
// apply 'array-update-with' element_size times
661
677
exprt result=src.op0 ();
662
678
663
- for (mp_integer i=0 ; i<element_size; ++i)
679
+ std::size_t i = 0 ;
680
+ for (const auto &element : new_value.operands ())
664
681
{
665
682
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
- }
683
+ ++i;
690
684
691
685
const exprt where = simplify_expr (plus_exprt (src.op1 (), i_expr), ns);
692
686
693
687
// skip elements that wouldn't change
694
- if (new_value .id () == ID_index)
688
+ if (element .id () == ID_index)
695
689
{
696
- const index_exprt &index_expr = to_index_expr (new_value );
690
+ const index_exprt &index_expr = to_index_expr (element );
697
691
if (index_expr.array () == src.op0 () && index_expr.index () == where)
698
692
continue ;
699
693
}
700
694
701
- with_exprt with_expr (result, where, new_value);
702
- with_expr.type ()=src.type ();
695
+ with_exprt with_expr (result, where, element);
703
696
704
697
result.swap (with_expr);
705
698
}
@@ -751,12 +744,6 @@ static exprt lower_byte_update(
751
744
else
752
745
stored_value_offset=minus_exprt (cell_offset, src.op1 ());
753
746
754
- auto extract_opcode=
755
- src.id ()==ID_byte_update_little_endian ?
756
- ID_byte_extract_little_endian :
757
- src.id ()==ID_byte_update_big_endian ?
758
- ID_byte_extract_big_endian :
759
- throw " unexpected src.id() in lower_byte_update" ;
760
747
byte_extract_exprt byte_extract_expr (
761
748
extract_opcode,
762
749
element_size<sub_size ? src.op2 ().type () : subtype);
0 commit comments