@@ -100,6 +100,8 @@ exprt flatten_byte_extract(
100
100
// add an extra element as the access need not be aligned with
101
101
// element boundaries and could thus stretch over extra elements
102
102
++num_elements;
103
+
104
+ assert (element_width!=0 );
103
105
104
106
// compute new root and offset
105
107
concatenation_exprt concat (
@@ -314,7 +316,9 @@ exprt flatten_byte_update(
314
316
t.id ()==ID_pointer)
315
317
{
316
318
// do a shift, mask and OR
317
- std::size_t width=to_bitvector_type (t).get_width ();
319
+ std::size_t width=integer2long (pointer_offset_size (t, ns)*8 );
320
+
321
+ assert (width!=0 );
318
322
319
323
if (element_size*8 >width)
320
324
throw " flatten_byte_update to update element that is too large" ;
@@ -333,10 +337,15 @@ exprt flatten_byte_update(
333
337
// do the 'AND'
334
338
bitand_exprt bitand_expr (src.op0 (), mask);
335
339
336
- // zero-extend the value
337
- concatenation_exprt value_extended (
338
- from_integer (0 , unsignedbv_typet (width-integer2unsigned (element_size)*8 )),
339
- src.op2 (), t);
340
+ // zero-extend the value, but only if needed
341
+ exprt value_extended;
342
+
343
+ if (width>integer2unsigned (element_size)*8 )
344
+ value_extended=concatenation_exprt (
345
+ from_integer (0 , unsignedbv_typet (width-integer2unsigned (element_size)*8 )),
346
+ src.op2 (), t);
347
+ else
348
+ value_extended=src.op2 ();
340
349
341
350
// shift the value
342
351
shl_exprt value_shifted (value_extended, offset_times_eight);
0 commit comments