CBMC
simplify_expr_class.h
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 
10 #ifndef CPROVER_UTIL_SIMPLIFY_EXPR_CLASS_H
11 #define CPROVER_UTIL_SIMPLIFY_EXPR_CLASS_H
12 
13 // #define DEBUG_ON_DEMAND
14 #ifdef DEBUG_ON_DEMAND
15 #include <sys/stat.h>
16 #endif
17 
18 #include <set>
19 
20 #include "expr.h"
21 #include "mp_arith.h"
22 #include "nodiscard.h"
23 #include "type.h"
24 // #define USE_LOCAL_REPLACE_MAP
25 #ifdef USE_LOCAL_REPLACE_MAP
26 #include "replace_expr.h"
27 #endif
28 
29 class abs_exprt;
30 class address_of_exprt;
31 class array_exprt;
32 class binary_exprt;
35 class bitnot_exprt;
36 class bitreverse_exprt;
37 class bswap_exprt;
38 class byte_extract_exprt;
39 class byte_update_exprt;
43 class dereference_exprt;
44 class div_exprt;
45 class exprt;
46 class extractbit_exprt;
47 class extractbits_exprt;
52 class if_exprt;
53 class index_exprt;
54 class lambda_exprt;
55 class member_exprt;
56 class minus_exprt;
57 class mod_exprt;
58 class multi_ary_exprt;
59 class mult_exprt;
60 class namespacet;
61 class not_exprt;
62 class object_size_exprt;
64 class plus_exprt;
67 class popcount_exprt;
69 class shift_exprt;
70 class sign_exprt;
71 class typecast_exprt;
72 class unary_exprt;
73 class unary_minus_exprt;
75 class unary_plus_exprt;
76 class update_exprt;
77 class with_exprt;
78 
80 {
81 public:
82  explicit simplify_exprt(const namespacet &_ns):
83  do_simplify_if(true),
84  ns(_ns)
85 #ifdef DEBUG_ON_DEMAND
86  , debug_on(false)
87 #endif
88  {
89 #ifdef DEBUG_ON_DEMAND
90  struct stat f;
91  debug_on=stat("SIMP_DEBUG", &f)==0;
92 #endif
93  }
94 
95  virtual ~simplify_exprt()
96  {
97  }
98 
100 
101  template <typename T = exprt>
102  struct resultt
103  {
104  bool has_changed() const
105  {
106  return expr_changed == CHANGED;
107  }
108 
110  {
113  } expr_changed;
114 
115  T expr;
116 
118  operator T() const
119  {
120  return expr;
121  }
122 
125  // NOLINTNEXTLINE(runtime/explicit)
126  resultt(T _expr) : expr_changed(CHANGED), expr(std::move(_expr))
127  {
128  }
129 
130  resultt(expr_changedt _expr_changed, T _expr)
131  : expr_changed(_expr_changed), expr(std::move(_expr))
132  {
133  }
134  };
135 
137  {
138  return resultt<>(resultt<>::UNCHANGED, std::move(expr));
139  }
140 
142  {
144  return result;
145  }
146 
147  // These below all return 'true' if the simplification wasn't applicable.
148  // If false is returned, the expression has changed.
163  bool simplify_if_preorder(if_exprt &expr);
197 
202 
207 
213 
218 
221 
224 
227 
230 
231  // auxiliary
232  bool simplify_if_implies(
233  exprt &expr, const exprt &cond, bool truth, bool &new_truth);
234  bool simplify_if_recursive(exprt &expr, const exprt &cond, bool truth);
235  bool simplify_if_conj(exprt &expr, const exprt &cond);
236  bool simplify_if_disj(exprt &expr, const exprt &cond);
237  bool simplify_if_branch(exprt &trueexpr, exprt &falseexpr, const exprt &cond);
238  bool simplify_if_cond(exprt &expr);
250 
251  // main recursion
253  bool simplify_node_preorder(exprt &expr);
255 
256  virtual bool simplify(exprt &expr);
257 
258  static bool is_bitvector_type(const typet &type)
259  {
260  return type.id()==ID_unsignedbv ||
261  type.id()==ID_signedbv ||
262  type.id()==ID_bv;
263  }
264 
265 protected:
266  const namespacet &ns;
267 #ifdef DEBUG_ON_DEMAND
268  bool debug_on;
269 #endif
270 #ifdef USE_LOCAL_REPLACE_MAP
271  replace_mapt local_replace_map;
272 #endif
273 
274 };
275 
276 #endif // CPROVER_UTIL_SIMPLIFY_EXPR_CLASS_H
with_exprt
Operator to update elements in structs and arrays.
Definition: std_expr.h:2423
simplify_exprt::~simplify_exprt
virtual ~simplify_exprt()
Definition: simplify_expr_class.h:95
simplify_exprt::simplify_rec
resultt simplify_rec(const exprt &)
Definition: simplify_expr.cpp:2836
simplify_exprt::simplify_object_size
resultt simplify_object_size(const object_size_exprt &)
Definition: simplify_expr_pointer.cpp:650
simplify_exprt::simplify_if_recursive
bool simplify_if_recursive(exprt &expr, const exprt &cond, bool truth)
Definition: simplify_expr_if.cpp:74
simplify_exprt::simplify_is_invalid_pointer
resultt simplify_is_invalid_pointer(const unary_exprt &)
Definition: simplify_expr_pointer.cpp:617
simplify_exprt::simplify_isnormal
resultt simplify_isnormal(const unary_exprt &)
Definition: simplify_expr_floatbv.cpp:51
simplify_exprt::simplify_if_disj
bool simplify_if_disj(exprt &expr, const exprt &cond)
Definition: simplify_expr_if.cpp:125
multi_ary_exprt
A base class for multi-ary expressions Associativity is not specified.
Definition: std_expr.h:856
simplify_exprt::simplify_shifts
resultt simplify_shifts(const shift_exprt &)
Definition: simplify_expr_int.cpp:915
simplify_exprt::simplify_dereference
resultt simplify_dereference(const dereference_exprt &)
Definition: simplify_expr.cpp:1351
simplify_exprt::simplify_concatenation
resultt simplify_concatenation(const concatenation_exprt &)
Definition: simplify_expr_int.cpp:813
simplify_exprt::simplify_pointer_offset
resultt simplify_pointer_offset(const pointer_offset_exprt &)
Definition: simplify_expr_pointer.cpp:248
byte_update_exprt
Expression corresponding to op() where the bytes starting at position offset (given in number of byte...
Definition: byte_operators.h:77
NODISCARD
#define NODISCARD
Definition: nodiscard.h:22
count_trailing_zeros_exprt
The count trailing zeros (counting the number of zero bits starting from the least-significant bit) e...
Definition: bitvector_expr.h:1067
mp_arith.h
simplify_exprt::simplify_address_of
resultt simplify_address_of(const address_of_exprt &)
Definition: simplify_expr_pointer.cpp:210
resultt
resultt
The result of goto verifying.
Definition: properties.h:44
simplify_exprt::simplify_unary_plus
resultt simplify_unary_plus(const unary_plus_exprt &)
Definition: simplify_expr_int.cpp:1120
simplify_exprt::simplify_bitwise
resultt simplify_bitwise(const multi_ary_exprt &)
Definition: simplify_expr_int.cpp:608
simplify_exprt::simplify_if_preorder
bool simplify_if_preorder(if_exprt &expr)
Definition: simplify_expr_if.cpp:214
simplify_exprt::simplify_bitnot
resultt simplify_bitnot(const bitnot_exprt &)
Definition: simplify_expr_int.cpp:1187
typet
The type of an expression, extends irept.
Definition: type.h:28
simplify_exprt::simplify_overflow_binary
resultt simplify_overflow_binary(const binary_overflow_exprt &)
Try to simplify overflow-+, overflow-*, overflow–, overflow-shl.
Definition: simplify_expr.cpp:2240
dereference_exprt
Operator to dereference a pointer.
Definition: pointer_expr.h:659
simplify_exprt::simplify_exprt
simplify_exprt(const namespacet &_ns)
Definition: simplify_expr_class.h:82
if_exprt
The trinary if-then-else operator.
Definition: std_expr.h:2322
simplify_exprt::simplify_popcount
resultt simplify_popcount(const popcount_exprt &)
Definition: simplify_expr.cpp:125
simplify_exprt::simplify_inequality_address_of
resultt simplify_inequality_address_of(const binary_relation_exprt &)
Definition: simplify_expr_pointer.cpp:410
simplify_exprt::simplify
virtual bool simplify(exprt &expr)
Definition: simplify_expr.cpp:2905
simplify_exprt::simplify_is_dynamic_object
resultt simplify_is_dynamic_object(const unary_exprt &)
Definition: simplify_expr_pointer.cpp:558
simplify_exprt::simplify_if_conj
bool simplify_if_conj(exprt &expr, const exprt &cond)
Definition: simplify_expr_if.cpp:106
simplify_exprt::simplify_clz
resultt simplify_clz(const count_leading_zeros_exprt &)
Try to simplify count-leading-zeros to a constant expression.
Definition: simplify_expr.cpp:151
nodiscard.h
simplify_exprt::simplify_update
resultt simplify_update(const update_exprt &)
Definition: simplify_expr.cpp:1494
plus_exprt
The plus expression Associativity is not specified.
Definition: std_expr.h:946
simplify_exprt::simplify_boolean
resultt simplify_boolean(const exprt &)
Definition: simplify_expr_boolean.cpp:20
simplify_exprt::simplify_overflow_unary
resultt simplify_overflow_unary(const unary_overflow_exprt &)
Try to simplify overflow-unary-.
Definition: simplify_expr.cpp:2312
exprt
Base class for all expressions.
Definition: expr.h:55
simplify_exprt::simplify_if_cond
bool simplify_if_cond(exprt &expr)
Definition: simplify_expr_if.cpp:176
simplify_exprt::simplify_ctz
resultt simplify_ctz(const count_trailing_zeros_exprt &)
Try to simplify count-trailing-zeros to a constant expression.
Definition: simplify_expr.cpp:177
unary_exprt
Generic base class for unary expressions.
Definition: std_expr.h:313
simplify_exprt::simplify_extractbit
resultt simplify_extractbit(const extractbit_exprt &)
Definition: simplify_expr_int.cpp:784
binary_exprt
A base class for binary expressions.
Definition: std_expr.h:582
overflow_result_exprt
An expression returning both the result of the arithmetic operation under wrap-around semantics as we...
Definition: bitvector_expr.h:1304
sign_exprt
Sign of an expression Predicate is true if _op is negative, false otherwise.
Definition: std_expr.h:538
concatenation_exprt
Concatenation of bit-vector operands.
Definition: bitvector_expr.h:607
simplify_exprt::simplify_complex
resultt simplify_complex(const unary_exprt &)
Definition: simplify_expr.cpp:2219
simplify_exprt::resultt::has_changed
bool has_changed() const
Definition: simplify_expr_class.h:104
div_exprt
Division.
Definition: std_expr.h:1096
simplify_exprt::simplify_plus
resultt simplify_plus(const plus_exprt &)
Definition: simplify_expr_int.cpp:402
object_size_exprt
Expression for finding the size (in bytes) of the object a pointer points to.
Definition: pointer_expr.h:1006
simplify_exprt::simplify_byte_extract
resultt simplify_byte_extract(const byte_extract_exprt &)
Definition: simplify_expr.cpp:1622
simplify_exprt::simplify_not
resultt simplify_not(const not_exprt &)
Definition: simplify_expr_boolean.cpp:230
simplify_exprt::simplify_inequality_both_constant
resultt simplify_inequality_both_constant(const binary_relation_exprt &)
simplifies inequalities for the case in which both sides of the inequality are constants
Definition: simplify_expr_int.cpp:1314
simplify_exprt::unchanged
static resultt unchanged(exprt expr)
Definition: simplify_expr_class.h:136
simplify_exprt::simplify_node
resultt simplify_node(exprt)
Definition: simplify_expr.cpp:2569
refined_string_exprt
Definition: string_expr.h:108
type.h
simplify_exprt::resultt::CHANGED
@ CHANGED
Definition: simplify_expr_class.h:111
expr.h
simplify_exprt::simplify_if
resultt simplify_if(const if_exprt &)
Definition: simplify_expr_if.cpp:330
namespacet
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition: namespace.h:90
simplify_exprt::resultt::UNCHANGED
@ UNCHANGED
Definition: simplify_expr_class.h:112
simplify_exprt::simplify_minus
resultt simplify_minus(const minus_exprt &)
Definition: simplify_expr_int.cpp:566
simplify_exprt::resultt::expr_changedt
expr_changedt
Definition: simplify_expr_class.h:109
simplify_exprt::simplify_power
resultt simplify_power(const binary_exprt &)
Definition: simplify_expr_int.cpp:1023
simplify_exprt::simplify_div
resultt simplify_div(const div_exprt &)
Definition: simplify_expr_int.cpp:271
simplify_exprt::simplify_inequality_no_constant
resultt simplify_inequality_no_constant(const binary_relation_exprt &)
Definition: simplify_expr_int.cpp:1475
simplify_exprt::simplify_typecast
resultt simplify_typecast(const typecast_exprt &)
Definition: simplify_expr.cpp:753
simplify_exprt::simplify_bitreverse
resultt simplify_bitreverse(const bitreverse_exprt &)
Try to simplify bit-reversing to a constant expression.
Definition: simplify_expr_int.cpp:1838
simplify_exprt::simplify_mod
resultt simplify_mod(const mod_exprt &)
Definition: simplify_expr_int.cpp:365
floatbv_typecast_exprt
Semantic type conversion from/to floating-point formats.
Definition: floatbv_expr.h:18
simplify_exprt::simplify_isnan
resultt simplify_isnan(const unary_exprt &)
Definition: simplify_expr_floatbv.cpp:37
binary_overflow_exprt
A Boolean expression returning true, iff operation kind would result in an overflow when applied to o...
Definition: bitvector_expr.h:704
simplify_exprt::changed
static resultt changed(resultt<> result)
Definition: simplify_expr_class.h:141
simplify_exprt::is_bitvector_type
static bool is_bitvector_type(const typet &type)
Definition: simplify_expr_class.h:258
simplify_exprt::simplify_inequality_rhs_is_constant
resultt simplify_inequality_rhs_is_constant(const binary_relation_exprt &)
Definition: simplify_expr_int.cpp:1555
simplify_exprt::simplify_bswap
resultt simplify_bswap(const bswap_exprt &)
Definition: simplify_expr_int.cpp:29
simplify_exprt::simplify_node_preorder
bool simplify_node_preorder(exprt &expr)
Definition: simplify_expr.cpp:2538
simplify_exprt::resultt::expr_changed
enum simplify_exprt::resultt::expr_changedt expr_changed
function_application_exprt
Application of (mathematical) function.
Definition: mathematical_expr.h:196
mult_exprt
Binary multiplication Associativity is not specified.
Definition: std_expr.h:1051
simplify_exprt::simplify_inequality
resultt simplify_inequality(const binary_relation_exprt &)
simplifies inequalities !=, <=, <, >=, >, and also ==
Definition: simplify_expr_int.cpp:1218
pointer_object_exprt
A numerical identifier for the object a pointer points to.
Definition: pointer_expr.h:947
simplify_exprt
Definition: simplify_expr_class.h:79
unary_minus_exprt
The unary minus expression.
Definition: std_expr.h:422
simplify_exprt::simplify_good_pointer
resultt simplify_good_pointer(const unary_exprt &)
Definition: simplify_expr_pointer.cpp:698
irept::id
const irep_idt & id() const
Definition: irep.h:396
abs_exprt
Absolute value.
Definition: std_expr.h:378
unary_plus_exprt
The unary plus expression.
Definition: std_expr.h:471
simplify_exprt::simplify_mult
resultt simplify_mult(const mult_exprt &)
Definition: simplify_expr_int.cpp:159
simplify_exprt::simplify_with
resultt simplify_with(const with_exprt &)
Definition: simplify_expr.cpp:1414
simplify_exprt::resultt
Definition: simplify_expr_class.h:102
simplify_exprt::resultt::resultt
resultt(expr_changedt _expr_changed, T _expr)
Definition: simplify_expr_class.h:130
simplify_exprt::simplify_unary_minus
resultt simplify_unary_minus(const unary_minus_exprt &)
Definition: simplify_expr_int.cpp:1127
simplify_exprt::simplify_function_application
resultt simplify_function_application(const function_application_exprt &)
Attempt to simplify mathematical function applications if we have enough information to do so.
Definition: simplify_expr.cpp:696
simplify_exprt::simplify_pointer_object
resultt simplify_pointer_object(const pointer_object_exprt &)
Definition: simplify_expr_pointer.cpp:526
minus_exprt
Binary minus.
Definition: std_expr.h:1005
update_exprt
Operator to update elements in structs and arrays.
Definition: std_expr.h:2607
simplify_exprt::simplify_if_branch
bool simplify_if_branch(exprt &trueexpr, exprt &falseexpr, const exprt &cond)
Definition: simplify_expr_if.cpp:144
simplify_exprt::simplify_index
resultt simplify_index(const index_exprt &)
Definition: simplify_expr_array.cpp:19
simplify_exprt::resultt::resultt
resultt(T _expr)
conversion from expression, thus not 'explicit' marks the expression as "CHANGED"
Definition: simplify_expr_class.h:126
bitnot_exprt
Bit-wise negation of bit-vectors.
Definition: bitvector_expr.h:81
extractbit_exprt
Extracts a single bit of a bit-vector operand.
Definition: bitvector_expr.h:380
member_exprt
Extract member of struct or union.
Definition: std_expr.h:2793
simplify_exprt::simplify_member
resultt simplify_member(const member_exprt &)
Definition: simplify_expr_struct.cpp:21
unary_overflow_exprt
A Boolean expression returning true, iff operation kind would result in an overflow when applied to t...
Definition: bitvector_expr.h:871
shift_exprt
A base class for shift and rotate operators.
Definition: bitvector_expr.h:229
simplify_exprt::simplify_object
resultt simplify_object(const exprt &)
Definition: simplify_expr.cpp:1542
simplify_exprt::simplify_inequality_pointer_object
resultt simplify_inequality_pointer_object(const binary_relation_exprt &)
Definition: simplify_expr_pointer.cpp:481
simplify_exprt::resultt::expr
T expr
Definition: simplify_expr_class.h:115
pointer_offset_exprt
The offset (in bytes) of a pointer relative to the object.
Definition: pointer_expr.h:889
lambda_exprt
A (mathematical) lambda expression.
Definition: mathematical_expr.h:421
simplify_exprt::simplify_sign
resultt simplify_sign(const sign_exprt &)
Definition: simplify_expr.cpp:99
replace_mapt
std::unordered_map< exprt, exprt, irep_hash > replace_mapt
Definition: replace_expr.h:22
binary_relation_exprt
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition: std_expr.h:706
byte_extract_exprt
Expression of type type extracted from some object op starting at position offset (given in number of...
Definition: byte_operators.h:28
simplify_exprt::simplify_lambda
resultt simplify_lambda(const lambda_exprt &)
Definition: simplify_expr.cpp:1409
simplify_exprt::simplify_if_implies
bool simplify_if_implies(exprt &expr, const exprt &cond, bool truth, bool &new_truth)
Definition: simplify_expr_if.cpp:15
simplify_exprt::simplify_extractbits
resultt simplify_extractbits(const extractbits_exprt &)
Simplifies extracting of bits from a constant.
Definition: simplify_expr_int.cpp:1044
ieee_float_op_exprt
IEEE floating-point operations These have two data operands (op0 and op1) and one rounding mode (op2)...
Definition: floatbv_expr.h:363
simplify_exprt::ns
const namespacet & ns
Definition: simplify_expr_class.h:266
bswap_exprt
The byte swap expression.
Definition: bitvector_expr.h:18
simplify_exprt::do_simplify_if
bool do_simplify_if
Definition: simplify_expr_class.h:99
simplify_exprt::simplify_address_of_arg
resultt simplify_address_of_arg(const exprt &)
Definition: simplify_expr_pointer.cpp:57
find_first_set_exprt
Returns one plus the index of the least-significant one bit, or zero if the operand is zero.
Definition: bitvector_expr.h:1432
extractbits_exprt
Extracts a sub-range of a bit-vector operand.
Definition: bitvector_expr.h:447
replace_expr.h
simplify_exprt::simplify_byte_update
resultt simplify_byte_update(const byte_update_exprt &)
Definition: simplify_expr.cpp:1910
index_exprt
Array index operator.
Definition: std_expr.h:1409
address_of_exprt
Operator to return the address of an object.
Definition: pointer_expr.h:370
popcount_exprt
The popcount (counting the number of bits set to 1) expression.
Definition: bitvector_expr.h:650
typecast_exprt
Semantic type conversion.
Definition: std_expr.h:2016
simplify_exprt::simplify_abs
resultt simplify_abs(const abs_exprt &)
Definition: simplify_expr.cpp:65
array_exprt
Array constructor from list of elements.
Definition: std_expr.h:1562
simplify_exprt::simplify_ieee_float_relation
resultt simplify_ieee_float_relation(const binary_relation_exprt &)
Definition: simplify_expr_floatbv.cpp:338
simplify_exprt::simplify_ffs
resultt simplify_ffs(const find_first_set_exprt &)
Try to simplify find-first-set to a constant expression.
Definition: simplify_expr.cpp:201
simplify_exprt::simplify_floatbv_typecast
resultt simplify_floatbv_typecast(const floatbv_typecast_exprt &)
Definition: simplify_expr_floatbv.cpp:139
mod_exprt
Modulo defined as lhs-(rhs * truncate(lhs/rhs)).
Definition: std_expr.h:1167
count_leading_zeros_exprt
The count leading zeros (counting the number of zero bits starting from the most-significant bit) exp...
Definition: bitvector_expr.h:974
simplify_exprt::simplify_floatbv_op
resultt simplify_floatbv_op(const ieee_float_op_exprt &)
Definition: simplify_expr_floatbv.cpp:273
simplify_exprt::simplify_overflow_result
resultt simplify_overflow_result(const overflow_result_exprt &)
Try to simplify overflow_result-+, overflow_result-*, overflow_result–, overflow_result-shl,...
Definition: simplify_expr.cpp:2360
bitreverse_exprt
Reverse the order of bits in a bit-vector.
Definition: bitvector_expr.h:1156
not_exprt
Boolean negation.
Definition: std_expr.h:2277
simplify_exprt::simplify_isinf
resultt simplify_isinf(const unary_exprt &)
Definition: simplify_expr_floatbv.cpp:23