Merge pull request #4229 from tautschnig/byte-op-cleanup

Code cleanup of byte_extract lowering of arrays, vectors [blocks: #2068]
This commit is contained in:
Michael Tautschnig 2019-02-19 10:18:20 +00:00 committed by GitHub
commit 21689646ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 18 deletions

View File

@ -417,19 +417,19 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
const array_typet &array_type=to_array_type(src.type()); const array_typet &array_type=to_array_type(src.type());
const typet &subtype=array_type.subtype(); const typet &subtype=array_type.subtype();
auto element_bits = pointer_offset_bits(subtype, ns);
auto num_elements = numeric_cast<mp_integer>(array_type.size());
if(!num_elements.has_value())
num_elements = mp_integer(unpacked.op().operands().size());
// consider ways of dealing with arrays of unknown subtype size or with a // consider ways of dealing with arrays of unknown subtype size or with a
// subtype size that does not fit byte boundaries; currently we fall back to // subtype size that does not fit byte boundaries; currently we fall back to
// stitching together consecutive elements down below // stitching together consecutive elements down below
auto element_bits = pointer_offset_bits(subtype, ns);
if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0) if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0)
{ {
array_exprt array({}, array_type); auto num_elements = numeric_cast<std::size_t>(array_type.size());
if(!num_elements.has_value())
num_elements = unpacked.op().operands().size();
for(mp_integer i=0; i< *num_elements; ++i) exprt::operandst operands;
operands.reserve(*num_elements);
for(std::size_t i = 0; i < *num_elements; ++i)
{ {
plus_exprt new_offset( plus_exprt new_offset(
unpacked.offset(), unpacked.offset(),
@ -439,10 +439,10 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
tmp.type()=subtype; tmp.type()=subtype;
tmp.offset()=new_offset; tmp.offset()=new_offset;
array.copy_to_operands(lower_byte_extract(tmp, ns)); operands.push_back(lower_byte_extract(tmp, ns));
} }
return simplify_expr(array, ns); return simplify_expr(array_exprt(std::move(operands), array_type), ns);
} }
} }
else if(src.type().id() == ID_vector) else if(src.type().id() == ID_vector)
@ -450,19 +450,18 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
const vector_typet &vector_type = to_vector_type(src.type()); const vector_typet &vector_type = to_vector_type(src.type());
const typet &subtype = vector_type.subtype(); const typet &subtype = vector_type.subtype();
mp_integer num_elements = numeric_cast_v<mp_integer>(vector_type.size());
auto element_bits = pointer_offset_bits(subtype, ns);
CHECK_RETURN(element_bits.has_value());
// consider ways of dealing with vectors of unknown subtype size or with a // consider ways of dealing with vectors of unknown subtype size or with a
// subtype size that does not fit byte boundaries; currently we fall back to // subtype size that does not fit byte boundaries; currently we fall back to
// stitching together consecutive elements down below // stitching together consecutive elements down below
auto element_bits = pointer_offset_bits(subtype, ns);
if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0) if(element_bits.has_value() && *element_bits >= 1 && *element_bits % 8 == 0)
{ {
vector_exprt vector(vector_type); const std::size_t num_elements =
numeric_cast_v<std::size_t>(vector_type.size());
for(mp_integer i = 0; i < num_elements; ++i) exprt::operandst operands;
operands.reserve(num_elements);
for(std::size_t i = 0; i < num_elements; ++i)
{ {
plus_exprt new_offset( plus_exprt new_offset(
unpacked.offset(), unpacked.offset(),
@ -472,10 +471,10 @@ exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
tmp.type() = subtype; tmp.type() = subtype;
tmp.offset() = simplify_expr(new_offset, ns); tmp.offset() = simplify_expr(new_offset, ns);
vector.copy_to_operands(lower_byte_extract(tmp, ns)); operands.push_back(lower_byte_extract(tmp, ns));
} }
return simplify_expr(vector, ns); return simplify_expr(vector_exprt(std::move(operands), vector_type), ns);
} }
} }
else if(ns.follow(src.type()).id()==ID_struct) else if(ns.follow(src.type()).id()==ID_struct)