Skip to content

Commit 8fc9b3f

Browse files
committed
Simplify {r,w,rw}_ok and pointer_in_range expressions
The rules replace the expression by a constant when (recursive) simplification yields such, else leave the expression unmodified.
1 parent cde51c5 commit 8fc9b3f

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/util/simplify_expr.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2905,6 +2905,14 @@ simplify_exprt::resultt<> simplify_exprt::simplify_node(exprt node)
29052905
{
29062906
r = simplify_bitreverse(to_bitreverse_expr(expr));
29072907
}
2908+
else if(expr.id() == ID_r_ok || expr.id() == ID_w_ok || expr.id() == ID_rw_ok)
2909+
{
2910+
r = simplify_r_or_w_ok(to_r_or_w_ok_expr(expr));
2911+
}
2912+
else if(expr.id() == ID_pointer_in_range)
2913+
{
2914+
r = simplify_pointer_in_range(to_pointer_in_range_expr(expr));
2915+
}
29082916

29092917
if(!no_change_join_operands)
29102918
r = changed(r);

src/util/simplify_expr_class.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,11 @@ class not_exprt;
6262
class object_size_exprt;
6363
class overflow_result_exprt;
6464
class plus_exprt;
65+
class pointer_in_range_exprt;
6566
class pointer_object_exprt;
6667
class pointer_offset_exprt;
6768
class popcount_exprt;
69+
class r_or_w_ok_exprt;
6870
class refined_string_exprt;
6971
class shift_exprt;
7072
class sign_exprt;
@@ -228,6 +230,12 @@ class simplify_exprt
228230
/// Try to simplify find-first-set to a constant expression.
229231
NODISCARD resultt<> simplify_ffs(const find_first_set_exprt &);
230232

233+
/// Try to simplify {r,w,rw}_ok to a constant expression.
234+
NODISCARD resultt<> simplify_r_or_w_ok(const r_or_w_ok_exprt &);
235+
236+
/// Try to simplify pointer_in_range to a constant expression.
237+
NODISCARD resultt<> simplify_pointer_in_range(const pointer_in_range_exprt &);
238+
231239
// auxiliary
232240
bool simplify_if_implies(
233241
exprt &expr, const exprt &cond, bool truth, bool &new_truth);

src/util/simplify_expr_pointer.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,3 +692,23 @@ simplify_exprt::simplify_object_size(const object_size_exprt &expr)
692692
else
693693
return std::move(new_expr);
694694
}
695+
696+
simplify_exprt::resultt<>
697+
simplify_exprt::simplify_r_or_w_ok(const r_or_w_ok_exprt &expr)
698+
{
699+
exprt new_expr = simplify_rec(expr.lower(ns));
700+
if(!new_expr.is_constant())
701+
return unchanged(expr);
702+
else
703+
return std::move(new_expr);
704+
}
705+
706+
simplify_exprt::resultt<>
707+
simplify_exprt::simplify_pointer_in_range(const pointer_in_range_exprt &expr)
708+
{
709+
exprt new_expr = simplify_rec(expr.lower(ns));
710+
if(!new_expr.is_constant())
711+
return unchanged(expr);
712+
else
713+
return std::move(new_expr);
714+
}

0 commit comments

Comments
 (0)