|
14 | 14 | #include <util/arith_tools.h>
|
15 | 15 | #include <util/byte_operators.h>
|
16 | 16 | #include <util/c_types.h>
|
| 17 | +#include <util/expr_iterator.h> |
17 | 18 | #include <util/pointer_offset_size.h>
|
18 | 19 | #include <util/simplify_expr.h>
|
19 | 20 |
|
@@ -169,6 +170,51 @@ replace_nondet(exprt &expr, symex_nondet_generatort &build_symex_nondet)
|
169 | 170 | }
|
170 | 171 | }
|
171 | 172 |
|
| 173 | +void goto_symext::lift_let( |
| 174 | + statet &state, |
| 175 | + const let_exprt &let_expr, |
| 176 | + assignment_typet assignment_type) |
| 177 | +{ |
| 178 | + exprt let_value = let_expr.value(); |
| 179 | + clean_expr(let_value, state, false); |
| 180 | + let_value = state.rename(std::move(let_value), ns).get(); |
| 181 | + do_simplify(let_value); |
| 182 | + |
| 183 | + exprt::operandst value_assignment_guard; |
| 184 | + symex_assign_symbol( |
| 185 | + state, |
| 186 | + to_ssa_expr(state.rename<L1>(let_expr.symbol(), ns).get()), |
| 187 | + nil_exprt(), |
| 188 | + let_value, |
| 189 | + value_assignment_guard, |
| 190 | + assignment_type); |
| 191 | +} |
| 192 | + |
| 193 | +void goto_symext::lift_lets( |
| 194 | + statet &state, |
| 195 | + exprt &rhs, |
| 196 | + assignment_typet assignment_type) |
| 197 | +{ |
| 198 | + for(auto it = rhs.depth_begin(), itend = rhs.depth_end(); it != itend;) |
| 199 | + { |
| 200 | + if(it->id() == ID_let) |
| 201 | + { |
| 202 | + // Visit post-order, so more-local definitions are made before usage: |
| 203 | + exprt &replaced_expr = it.mutate(); |
| 204 | + let_exprt &replaced_let = to_let_expr(replaced_expr); |
| 205 | + lift_lets(state, replaced_let.value(), assignment_type); |
| 206 | + lift_lets(state, replaced_let.where(), assignment_type); |
| 207 | + |
| 208 | + lift_let(state, replaced_let, assignment_type); |
| 209 | + replaced_expr = replaced_let.where(); |
| 210 | + |
| 211 | + it.next_sibling_or_parent(); |
| 212 | + } |
| 213 | + else |
| 214 | + ++it; |
| 215 | + } |
| 216 | +} |
| 217 | + |
172 | 218 | void goto_symext::clean_expr(
|
173 | 219 | exprt &expr,
|
174 | 220 | statet &state,
|
|
0 commit comments