@@ -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