Skip to content

Commit 62ab50c

Browse files
author
Daniel Kroening
committed
further work on byte operator flattening
1 parent 150e324 commit 62ab50c

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

src/solvers/flattening/flatten_byte_operators.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ exprt flatten_byte_extract(
100100
// add an extra element as the access need not be aligned with
101101
// element boundaries and could thus stretch over extra elements
102102
++num_elements;
103+
104+
assert(element_width!=0);
103105

104106
// compute new root and offset
105107
concatenation_exprt concat(
@@ -314,7 +316,9 @@ exprt flatten_byte_update(
314316
t.id()==ID_pointer)
315317
{
316318
// 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);
318322

319323
if(element_size*8>width)
320324
throw "flatten_byte_update to update element that is too large";
@@ -333,10 +337,15 @@ exprt flatten_byte_update(
333337
// do the 'AND'
334338
bitand_exprt bitand_expr(src.op0(), mask);
335339

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();
340349

341350
// shift the value
342351
shl_exprt value_shifted(value_extended, offset_times_eight);

0 commit comments

Comments
 (0)