Skip to content

Commit 2168964

Browse files
authored
Merge pull request #4229 from tautschnig/byte-op-cleanup
Code cleanup of byte_extract lowering of arrays, vectors [blocks: #2068]
2 parents 8e09141 + 7bbb662 commit 2168964

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

src/solvers/lowering/byte_operators.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -417,19 +417,19 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
417417
const array_typet &array_type=to_array_type(src.type());
418418
const typet &subtype=array_type.subtype();
419419

420-
auto element_bits = pointer_offset_bits(subtype, ns);
421-
auto num_elements = numeric_cast<mp_integer>(array_type.size());
422-
if(!num_elements.has_value())
423-
num_elements = mp_integer(unpacked.op().operands().size());
424-
425420
// consider ways of dealing with arrays of unknown subtype size or with a
426421
// subtype size that does not fit byte boundaries; currently we fall back to
427422
// stitching together consecutive elements down below
423+
auto element_bits = pointer_offset_bits(subtype, ns);
428424
if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0)
429425
{
430-
array_exprt array({}, array_type);
426+
auto num_elements = numeric_cast<std::size_t>(array_type.size());
427+
if(!num_elements.has_value())
428+
num_elements = unpacked.op().operands().size();
431429

432-
for(mp_integer i=0; i< *num_elements; ++i)
430+
exprt::operandst operands;
431+
operands.reserve(*num_elements);
432+
for(std::size_t i = 0; i < *num_elements; ++i)
433433
{
434434
plus_exprt new_offset(
435435
unpacked.offset(),
@@ -439,30 +439,29 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
439439
tmp.type()=subtype;
440440
tmp.offset()=new_offset;
441441

442-
array.copy_to_operands(lower_byte_extract(tmp, ns));
442+
operands.push_back(lower_byte_extract(tmp, ns));
443443
}
444444

445-
return simplify_expr(array, ns);
445+
return simplify_expr(array_exprt(std::move(operands), array_type), ns);
446446
}
447447
}
448448
else if(src.type().id() == ID_vector)
449449
{
450450
const vector_typet &vector_type = to_vector_type(src.type());
451451
const typet &subtype = vector_type.subtype();
452452

453-
mp_integer num_elements = numeric_cast_v<mp_integer>(vector_type.size());
454-
455-
auto element_bits = pointer_offset_bits(subtype, ns);
456-
CHECK_RETURN(element_bits.has_value());
457-
458453
// consider ways of dealing with vectors of unknown subtype size or with a
459454
// subtype size that does not fit byte boundaries; currently we fall back to
460455
// stitching together consecutive elements down below
456+
auto element_bits = pointer_offset_bits(subtype, ns);
461457
if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0)
462458
{
463-
vector_exprt vector(vector_type);
459+
const std::size_t num_elements =
460+
numeric_cast_v<std::size_t>(vector_type.size());
464461

465-
for(mp_integer i = 0; i < num_elements; ++i)
462+
exprt::operandst operands;
463+
operands.reserve(num_elements);
464+
for(std::size_t i = 0; i < num_elements; ++i)
466465
{
467466
plus_exprt new_offset(
468467
unpacked.offset(),
@@ -472,10 +471,10 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
472471
tmp.type() = subtype;
473472
tmp.offset() = simplify_expr(new_offset, ns);
474473

475-
vector.copy_to_operands(lower_byte_extract(tmp, ns));
474+
operands.push_back(lower_byte_extract(tmp, ns));
476475
}
477476

478-
return simplify_expr(vector, ns);
477+
return simplify_expr(vector_exprt(std::move(operands), vector_type), ns);
479478
}
480479
}
481480
else if(ns.follow(src.type()).id()==ID_struct)

0 commit comments

Comments
 (0)