Skip to content

Commit cec9dd8

Browse files
author
Daniel Kroening
committed
simplifier: pointer-related simplifications now have new interface
The new interface is memory safe and less prone to error.
1 parent 12b20c3 commit cec9dd8

File tree

3 files changed

+314
-244
lines changed

3 files changed

+314
-244
lines changed

src/util/simplify_expr.cpp

Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,21 +1579,16 @@ bool simplify_exprt::simplify_update(exprt &expr)
15791579
return false;
15801580
}
15811581

1582-
bool simplify_exprt::simplify_object(exprt &expr)
1582+
simplify_exprt::resultt<> simplify_exprt::simplify_object(const exprt &expr)
15831583
{
15841584
if(expr.id()==ID_plus)
15851585
{
15861586
if(expr.type().id()==ID_pointer)
15871587
{
15881588
// kill integers from sum
1589-
Forall_operands(it, expr)
1590-
if(it->type().id() == ID_pointer)
1591-
{
1592-
exprt tmp=*it;
1593-
expr.swap(tmp);
1594-
simplify_object(expr);
1595-
return false;
1596-
}
1589+
for(auto &op : expr.operands())
1590+
if(op.type().id() == ID_pointer)
1591+
return changed(simplify_object(op)); // recursive call
15971592
}
15981593
}
15991594
else if(expr.id()==ID_typecast)
@@ -1604,9 +1599,7 @@ bool simplify_exprt::simplify_object(exprt &expr)
16041599
if(op_type.id()==ID_pointer)
16051600
{
16061601
// cast from pointer to pointer
1607-
expr = typecast_expr.op();
1608-
simplify_object(expr);
1609-
return false;
1602+
return changed(simplify_object(typecast_expr.op())); // recursive call
16101603
}
16111604
else if(op_type.id()==ID_signedbv || op_type.id()==ID_unsignedbv)
16121605
{
@@ -1626,8 +1619,7 @@ bool simplify_exprt::simplify_object(exprt &expr)
16261619
cand.operands().size()==1 &&
16271620
cand.op0().id()==ID_address_of)
16281621
{
1629-
expr=cand.op0();
1630-
return false;
1622+
return cand.op0();
16311623
}
16321624
else if(cand.id()==ID_typecast &&
16331625
cand.operands().size()==1 &&
@@ -1637,8 +1629,7 @@ bool simplify_exprt::simplify_object(exprt &expr)
16371629
cand.op0().op0().operands().size()==1 &&
16381630
cand.op0().op0().op0().id()==ID_address_of)
16391631
{
1640-
expr=cand.op0().op0().op0();
1641-
return false;
1632+
return cand.op0().op0().op0();
16421633
}
16431634
}
16441635
}
@@ -1651,22 +1642,18 @@ bool simplify_exprt::simplify_object(exprt &expr)
16511642
{
16521643
// &some[i] -> &some
16531644
address_of_exprt new_expr(expr.op0().op0());
1654-
expr.swap(new_expr);
1655-
simplify_object(expr); // recursion
1656-
return false;
1645+
return changed(simplify_object(new_expr)); // recursion
16571646
}
16581647
else if(expr.op0().id()==ID_member && expr.op0().operands().size()==1)
16591648
{
16601649
// &some.f -> &some
16611650
address_of_exprt new_expr(expr.op0().op0());
1662-
expr.swap(new_expr);
1663-
simplify_object(expr); // recursion
1664-
return false;
1651+
return changed(simplify_object(new_expr)); // recursion
16651652
}
16661653
}
16671654
}
16681655

1669-
return true;
1656+
return unchanged(expr);
16701657
}
16711658

16721659
optionalt<exprt> simplify_exprt::bits2expr(
@@ -2563,17 +2550,50 @@ bool simplify_exprt::simplify_node(exprt &expr)
25632550
}
25642551
}
25652552
else if(expr.id()==ID_pointer_object)
2566-
no_change = simplify_pointer_object(expr) && no_change;
2553+
{
2554+
auto r = simplify_pointer_object(expr);
2555+
if(r.has_changed())
2556+
{
2557+
no_change = false;
2558+
expr = r.expr;
2559+
}
2560+
}
25672561
else if(expr.id() == ID_is_dynamic_object)
25682562
{
2569-
no_change = simplify_is_dynamic_object(expr) && no_change;
2563+
auto r = simplify_is_dynamic_object(expr);
2564+
if(r.has_changed())
2565+
{
2566+
no_change = false;
2567+
expr = r.expr;
2568+
}
25702569
}
25712570
else if(expr.id() == ID_is_invalid_pointer)
2572-
no_change = simplify_is_invalid_pointer(expr) && no_change;
2571+
{
2572+
auto r = simplify_is_invalid_pointer(expr);
2573+
if(r.has_changed())
2574+
{
2575+
no_change = false;
2576+
expr = r.expr;
2577+
}
2578+
}
25732579
else if(expr.id()==ID_object_size)
2574-
no_change = simplify_object_size(expr) && no_change;
2580+
{
2581+
auto r = simplify_object_size(expr);
2582+
if(r.has_changed())
2583+
{
2584+
no_change = false;
2585+
expr = r.expr;
2586+
}
2587+
}
25752588
else if(expr.id()==ID_good_pointer)
2576-
no_change = simplify_good_pointer(expr) && no_change;
2589+
{
2590+
auto r = simplify_good_pointer(expr);
2591+
if(r.has_changed())
2592+
{
2593+
no_change = false;
2594+
expr = r.expr;
2595+
}
2596+
}
25772597
else if(expr.id()==ID_div)
25782598
no_change = simplify_div(expr) && no_change;
25792599
else if(expr.id()==ID_mod)
@@ -2621,9 +2641,23 @@ bool simplify_exprt::simplify_node(exprt &expr)
26212641
}
26222642
}
26232643
else if(expr.id()==ID_address_of)
2624-
no_change = simplify_address_of(expr) && no_change;
2644+
{
2645+
auto r = simplify_address_of(to_address_of_expr(expr));
2646+
if(r.has_changed())
2647+
{
2648+
no_change = false;
2649+
expr = r.expr;
2650+
}
2651+
}
26252652
else if(expr.id()==ID_pointer_offset)
2626-
no_change = simplify_pointer_offset(expr) && no_change;
2653+
{
2654+
auto r = simplify_pointer_offset(expr);
2655+
if(r.has_changed())
2656+
{
2657+
no_change = false;
2658+
expr = r.expr;
2659+
}
2660+
}
26272661
else if(expr.id()==ID_extractbit)
26282662
no_change = simplify_extractbit(expr) && no_change;
26292663
else if(expr.id()==ID_concatenation)

src/util/simplify_expr_class.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Author: Daniel Kroening, [email protected]
2727
#endif
2828

2929
class abs_exprt;
30+
class address_of_exprt;
3031
class array_exprt;
3132
class bswap_exprt;
3233
class byte_extract_exprt;
@@ -146,19 +147,19 @@ class simplify_exprt
146147
bool simplify_member(exprt &expr);
147148
NODISCARD resultt<> simplify_byte_update(const byte_update_exprt &);
148149
NODISCARD resultt<> simplify_byte_extract(const byte_extract_exprt &);
149-
bool simplify_pointer_object(exprt &expr);
150-
bool simplify_object_size(exprt &expr);
150+
NODISCARD resultt<> simplify_pointer_object(const exprt &);
151+
NODISCARD resultt<> simplify_object_size(const exprt &);
151152
bool simplify_dynamic_size(exprt &expr);
152-
bool simplify_is_dynamic_object(exprt &expr);
153-
bool simplify_is_invalid_pointer(exprt &expr);
154-
bool simplify_same_object(exprt &expr);
155-
bool simplify_good_pointer(exprt &expr);
156-
bool simplify_object(exprt &expr);
153+
NODISCARD resultt<> simplify_is_dynamic_object(const exprt &expr);
154+
NODISCARD resultt<> simplify_is_invalid_pointer(const exprt &expr);
155+
NODISCARD resultt<> simplify_same_object(const exprt &);
156+
NODISCARD resultt<> simplify_good_pointer(const exprt &);
157+
NODISCARD resultt<> simplify_object(const exprt &);
157158
bool simplify_unary_minus(exprt &expr);
158159
bool simplify_unary_plus(exprt &expr);
159160
NODISCARD resultt<> simplify_dereference(const dereference_exprt &);
160-
bool simplify_address_of(exprt &expr);
161-
bool simplify_pointer_offset(exprt &expr);
161+
NODISCARD resultt<> simplify_address_of(const address_of_exprt &);
162+
NODISCARD resultt<> simplify_pointer_offset(const exprt &);
162163
bool simplify_bswap(bswap_exprt &expr);
163164
bool simplify_isinf(exprt &expr);
164165
bool simplify_isnan(exprt &expr);
@@ -184,7 +185,7 @@ class simplify_exprt
184185
bool eliminate_common_addends(exprt &op0, exprt &op1);
185186
static tvt objects_equal(const exprt &a, const exprt &b);
186187
static tvt objects_equal_address_of(const exprt &a, const exprt &b);
187-
bool simplify_address_of_arg(exprt &expr);
188+
NODISCARD resultt<> simplify_address_of_arg(const exprt &);
188189
bool simplify_inequality_both_constant(exprt &);
189190
bool simplify_inequality_no_constant(exprt &);
190191
bool simplify_inequality_rhs_is_constant(exprt &);

0 commit comments

Comments
 (0)