Skip to content

Commit f96862c

Browse files
author
Daniel Kroening
authored
Merge pull request #4857 from diffblue/simplify_expr_pointer
Simplifier: new interface for pointer-related simplifications
2 parents 52648b0 + cec9dd8 commit f96862c

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)
@@ -2635,9 +2655,23 @@ bool simplify_exprt::simplify_node(exprt &expr)
26352655
}
26362656
}
26372657
else if(expr.id()==ID_address_of)
2638-
no_change = simplify_address_of(expr) && no_change;
2658+
{
2659+
auto r = simplify_address_of(to_address_of_expr(expr));
2660+
if(r.has_changed())
2661+
{
2662+
no_change = false;
2663+
expr = r.expr;
2664+
}
2665+
}
26392666
else if(expr.id()==ID_pointer_offset)
2640-
no_change = simplify_pointer_offset(expr) && no_change;
2667+
{
2668+
auto r = simplify_pointer_offset(expr);
2669+
if(r.has_changed())
2670+
{
2671+
no_change = false;
2672+
expr = r.expr;
2673+
}
2674+
}
26412675
else if(expr.id()==ID_extractbit)
26422676
no_change = simplify_extractbit(expr) && no_change;
26432677
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 binary_relation_exprt;
3233
class bswap_exprt;
@@ -151,19 +152,19 @@ class simplify_exprt
151152
bool simplify_member(exprt &expr);
152153
NODISCARD resultt<> simplify_byte_update(const byte_update_exprt &);
153154
NODISCARD resultt<> simplify_byte_extract(const byte_extract_exprt &);
154-
bool simplify_pointer_object(exprt &expr);
155-
bool simplify_object_size(exprt &expr);
155+
NODISCARD resultt<> simplify_pointer_object(const exprt &);
156+
NODISCARD resultt<> simplify_object_size(const exprt &);
156157
bool simplify_dynamic_size(exprt &expr);
157-
bool simplify_is_dynamic_object(exprt &expr);
158-
bool simplify_is_invalid_pointer(exprt &expr);
159-
bool simplify_same_object(exprt &expr);
160-
bool simplify_good_pointer(exprt &expr);
161-
bool simplify_object(exprt &expr);
158+
NODISCARD resultt<> simplify_is_dynamic_object(const exprt &expr);
159+
NODISCARD resultt<> simplify_is_invalid_pointer(const exprt &expr);
160+
NODISCARD resultt<> simplify_same_object(const exprt &);
161+
NODISCARD resultt<> simplify_good_pointer(const exprt &);
162+
NODISCARD resultt<> simplify_object(const exprt &);
162163
bool simplify_unary_minus(exprt &expr);
163164
bool simplify_unary_plus(exprt &expr);
164165
NODISCARD resultt<> simplify_dereference(const dereference_exprt &);
165-
bool simplify_address_of(exprt &expr);
166-
bool simplify_pointer_offset(exprt &expr);
166+
NODISCARD resultt<> simplify_address_of(const address_of_exprt &);
167+
NODISCARD resultt<> simplify_pointer_offset(const exprt &);
167168
bool simplify_bswap(bswap_exprt &expr);
168169
NODISCARD resultt<> simplify_isinf(const unary_exprt &);
169170
NODISCARD resultt<> simplify_isnan(const unary_exprt &);
@@ -189,7 +190,7 @@ class simplify_exprt
189190
bool eliminate_common_addends(exprt &op0, exprt &op1);
190191
static tvt objects_equal(const exprt &a, const exprt &b);
191192
static tvt objects_equal_address_of(const exprt &a, const exprt &b);
192-
bool simplify_address_of_arg(exprt &expr);
193+
NODISCARD resultt<> simplify_address_of_arg(const exprt &);
193194
bool simplify_inequality_both_constant(exprt &);
194195
bool simplify_inequality_no_constant(exprt &);
195196
bool simplify_inequality_rhs_is_constant(exprt &);

0 commit comments

Comments
 (0)