Skip to content

Commit de989ce

Browse files
author
Daniel Kroening
authored
Merge pull request #4853 from diffblue/simplifier_arith_ops
Simplifier: new interface for arithmetic expressions
2 parents 069e75e + 1c5dd94 commit de989ce

File tree

3 files changed

+222
-225
lines changed

3 files changed

+222
-225
lines changed

src/util/simplify_expr.cpp

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,11 +2000,10 @@ simplify_exprt::simplify_byte_extract(const byte_extract_exprt &expr)
20002000
{
20012001
auto tmp = expr;
20022002

2003-
tmp.offset() =
2004-
plus_exprt(to_byte_extract_expr(expr.op()).offset(), expr.offset());
2005-
simplify_plus(tmp.offset());
2006-
2003+
tmp.offset() = simplify_plus(
2004+
plus_exprt(to_byte_extract_expr(expr.op()).offset(), expr.offset()));
20072005
tmp.op() = to_byte_extract_expr(expr.op()).op();
2006+
20082007
return changed(simplify_byte_extract(tmp)); // recursive call
20092008
}
20102009

@@ -2595,25 +2594,81 @@ bool simplify_exprt::simplify_node(exprt &expr)
25952594
}
25962595
}
25972596
else if(expr.id()==ID_div)
2598-
no_change = simplify_div(expr) && no_change;
2597+
{
2598+
auto r = simplify_div(to_div_expr(expr));
2599+
if(r.has_changed())
2600+
{
2601+
no_change = false;
2602+
expr = r.expr;
2603+
}
2604+
}
25992605
else if(expr.id()==ID_mod)
2600-
no_change = simplify_mod(expr) && no_change;
2606+
{
2607+
auto r = simplify_mod(to_mod_expr(expr));
2608+
if(r.has_changed())
2609+
{
2610+
no_change = false;
2611+
expr = r.expr;
2612+
}
2613+
}
26012614
else if(expr.id()==ID_bitnot)
26022615
no_change = simplify_bitnot(expr) && no_change;
26032616
else if(expr.id()==ID_bitand ||
26042617
expr.id()==ID_bitor ||
26052618
expr.id()==ID_bitxor)
2606-
no_change = simplify_bitwise(expr) && no_change;
2619+
{
2620+
auto r = simplify_bitwise(expr);
2621+
if(r.has_changed())
2622+
{
2623+
no_change = false;
2624+
expr = r.expr;
2625+
}
2626+
}
26072627
else if(expr.id()==ID_ashr || expr.id()==ID_lshr || expr.id()==ID_shl)
2608-
no_change = simplify_shifts(expr) && no_change;
2628+
{
2629+
auto r = simplify_shifts(expr);
2630+
if(r.has_changed())
2631+
{
2632+
no_change = false;
2633+
expr = r.expr;
2634+
}
2635+
}
26092636
else if(expr.id()==ID_power)
2610-
no_change = simplify_power(expr) && no_change;
2637+
{
2638+
auto r = simplify_power(expr);
2639+
if(r.has_changed())
2640+
{
2641+
no_change = false;
2642+
expr = r.expr;
2643+
}
2644+
}
26112645
else if(expr.id()==ID_plus)
2612-
no_change = simplify_plus(expr) && no_change;
2646+
{
2647+
auto r = simplify_plus(to_plus_expr(expr));
2648+
if(r.has_changed())
2649+
{
2650+
no_change = false;
2651+
expr = r.expr;
2652+
}
2653+
}
26132654
else if(expr.id()==ID_minus)
2614-
no_change = simplify_minus(expr) && no_change;
2655+
{
2656+
auto r = simplify_minus(to_minus_expr(expr));
2657+
if(r.has_changed())
2658+
{
2659+
no_change = false;
2660+
expr = r.expr;
2661+
}
2662+
}
26152663
else if(expr.id()==ID_mult)
2616-
no_change = simplify_mult(expr) && no_change;
2664+
{
2665+
auto r = simplify_mult(to_mult_expr(expr));
2666+
if(r.has_changed())
2667+
{
2668+
no_change = false;
2669+
expr = r.expr;
2670+
}
2671+
}
26172672
else if(expr.id()==ID_floatbv_plus ||
26182673
expr.id()==ID_floatbv_minus ||
26192674
expr.id()==ID_floatbv_mult ||

src/util/simplify_expr_class.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class bswap_exprt;
3434
class byte_extract_exprt;
3535
class byte_update_exprt;
3636
class dereference_exprt;
37+
class div_exprt;
3738
class exprt;
3839
class extractbits_exprt;
3940
class floatbv_typecast_exprt;
@@ -42,7 +43,11 @@ class ieee_float_op_exprt;
4243
class if_exprt;
4344
class index_exprt;
4445
class member_exprt;
46+
class minus_exprt;
47+
class mod_exprt;
48+
class mult_exprt;
4549
class namespacet;
50+
class plus_exprt;
4651
class popcount_exprt;
4752
class refined_string_exprt;
4853
class tvt;
@@ -127,16 +132,16 @@ class simplify_exprt
127132
bool simplify_extractbit(exprt &expr);
128133
bool simplify_extractbits(extractbits_exprt &expr);
129134
bool simplify_concatenation(exprt &expr);
130-
bool simplify_mult(exprt &expr);
131-
bool simplify_div(exprt &expr);
132-
bool simplify_mod(exprt &expr);
133-
bool simplify_plus(exprt &expr);
134-
bool simplify_minus(exprt &expr);
135+
NODISCARD resultt<> simplify_mult(const mult_exprt &);
136+
NODISCARD resultt<> simplify_div(const div_exprt &);
137+
NODISCARD resultt<> simplify_mod(const mod_exprt &);
138+
NODISCARD resultt<> simplify_plus(const plus_exprt &);
139+
NODISCARD resultt<> simplify_minus(const minus_exprt &);
135140
NODISCARD resultt<> simplify_floatbv_op(const ieee_float_op_exprt &);
136141
NODISCARD resultt<> simplify_floatbv_typecast(const floatbv_typecast_exprt &);
137-
bool simplify_shifts(exprt &expr);
138-
bool simplify_power(exprt &expr);
139-
bool simplify_bitwise(exprt &expr);
142+
NODISCARD resultt<> simplify_shifts(const exprt &);
143+
NODISCARD resultt<> simplify_power(const exprt &);
144+
NODISCARD resultt<> simplify_bitwise(const exprt &);
140145
bool simplify_if_preorder(if_exprt &expr);
141146
bool simplify_if(if_exprt &expr);
142147
bool simplify_bitnot(exprt &expr);

0 commit comments

Comments
 (0)