@@ -417,19 +417,19 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
417
417
const array_typet &array_type=to_array_type (src.type ());
418
418
const typet &subtype=array_type.subtype ();
419
419
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
-
425
420
// consider ways of dealing with arrays of unknown subtype size or with a
426
421
// subtype size that does not fit byte boundaries; currently we fall back to
427
422
// stitching together consecutive elements down below
423
+ auto element_bits = pointer_offset_bits (subtype, ns);
428
424
if (element_bits.has_value () && *element_bits >= 1 && *element_bits % 8 == 0 )
429
425
{
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 ();
431
429
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)
433
433
{
434
434
plus_exprt new_offset (
435
435
unpacked.offset (),
@@ -439,30 +439,29 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
439
439
tmp.type ()=subtype;
440
440
tmp.offset ()=new_offset;
441
441
442
- array. copy_to_operands (lower_byte_extract (tmp, ns));
442
+ operands. push_back (lower_byte_extract (tmp, ns));
443
443
}
444
444
445
- return simplify_expr (array , ns);
445
+ return simplify_expr (array_exprt ( std::move (operands), array_type) , ns);
446
446
}
447
447
}
448
448
else if (src.type ().id () == ID_vector)
449
449
{
450
450
const vector_typet &vector_type = to_vector_type (src.type ());
451
451
const typet &subtype = vector_type.subtype ();
452
452
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
-
458
453
// consider ways of dealing with vectors of unknown subtype size or with a
459
454
// subtype size that does not fit byte boundaries; currently we fall back to
460
455
// stitching together consecutive elements down below
456
+ auto element_bits = pointer_offset_bits (subtype, ns);
461
457
if (element_bits.has_value () && *element_bits >= 1 && *element_bits % 8 == 0 )
462
458
{
463
- vector_exprt vector (vector_type);
459
+ const std::size_t num_elements =
460
+ numeric_cast_v<std::size_t >(vector_type.size ());
464
461
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)
466
465
{
467
466
plus_exprt new_offset (
468
467
unpacked.offset (),
@@ -472,10 +471,10 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
472
471
tmp.type () = subtype;
473
472
tmp.offset () = simplify_expr (new_offset, ns);
474
473
475
- vector. copy_to_operands (lower_byte_extract (tmp, ns));
474
+ operands. push_back (lower_byte_extract (tmp, ns));
476
475
}
477
476
478
- return simplify_expr (vector , ns);
477
+ return simplify_expr (vector_exprt ( std::move (operands), vector_type) , ns);
479
478
}
480
479
}
481
480
else if (ns.follow (src.type ()).id ()==ID_struct)
0 commit comments