Skip to content

Commit d60295d

Browse files
authored
Merge pull request #7340 from tautschnig/feature/be-simplify-lowering
Simplify byte extract: use lowering when expression is a constant
2 parents 4267df2 + 7c2fa6f commit d60295d

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

regression/cbmc-library/memcpy-01/constant-propagation.desc

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
main.c
3-
--show-vcc
4-
main::1::m!0@1#2 = .*byte_extract_(big|little)_endian\(cast\(44, signedbv\[\d+\]\*\), 0, signedbv\[\d+\]\).*
3+
4+
^Generated 1\d* VCC\(s\), 0 remaining after simplification$
55
^EXIT=0$
66
^SIGNAL=0$
77
--

src/util/simplify_expr.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -1976,10 +1976,13 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
19761976
// try to refine it down to extracting from a member or an index in an array
19771977
auto subexpr =
19781978
get_subexpression_at_offset(expr.op(), *offset, expr.type(), ns);
1979-
if(!subexpr.has_value() || subexpr.value() == expr)
1980-
return unchanged(expr);
1979+
if(subexpr.has_value() && subexpr.value() != expr)
1980+
return changed(simplify_rec(subexpr.value())); // recursive call
1981+
1982+
if(is_constantt(ns)(expr))
1983+
return changed(simplify_rec(lower_byte_extract(expr, ns)));
19811984

1982-
return changed(simplify_rec(subexpr.value())); // recursive call
1985+
return unchanged(expr);
19831986
}
19841987

19851988
simplify_exprt::resultt<>

src/util/simplify_expr_int.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,14 @@ simplify_exprt::simplify_concatenation(const concatenation_exprt &expr)
906906
.set_width(
907907
to_bitvector_type(eb_i.type()).get_width() +
908908
to_bitvector_type(eb_n.type()).get_width());
909-
opi = eb_merged;
909+
if(expr.type().id() != eb_merged.type().id())
910+
{
911+
bitvector_typet bt = to_bitvector_type(expr.type());
912+
bt.set_width(to_bitvector_type(eb_merged.type()).get_width());
913+
opi = simplify_typecast(typecast_exprt{eb_merged, bt});
914+
}
915+
else
916+
opi = eb_merged;
910917
// erase opn
911918
new_expr.operands().erase(new_expr.operands().begin() + i + 1);
912919
no_change = false;

0 commit comments

Comments
 (0)