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:
commit
21689646ef
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue