Skip to content

Commit 4ca5820

Browse files
committed
Lift-lets: always emit hidden assignments
Taking inspiration from #return_value variables, which are always marked as hidden, since all let-bound variables encountered by symex are synthetic we mark those hidden too.
1 parent 3bfeaf4 commit 4ca5820

File tree

2 files changed

+9
-16
lines changed

2 files changed

+9
-16
lines changed

src/goto-symex/goto_symex.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,10 +497,7 @@ class goto_symext
497497
typedef symex_targett::assignment_typet assignment_typet;
498498

499499
void lift_lets(statet &, exprt &, assignment_typet);
500-
void lift_let(
501-
statet &state,
502-
const let_exprt &let_expr,
503-
assignment_typet assignment_type);
500+
void lift_let(statet &state, const let_exprt &let_expr);
504501

505502
void symex_assign_rec(
506503
statet &,

src/goto-symex/symex_clean_expr.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ void goto_symext::process_array_expr(statet &state, exprt &expr)
128128
ns, state.symbol_table, symex_dereference_state, language_mode, false);
129129

130130
expr = dereference.dereference(expr);
131-
lift_lets(state, expr, symex_targett::assignment_typet::STATE);
131+
lift_lets(state, expr);
132132

133133
::process_array_expr(expr, symex_config.simplify_opt, ns);
134134
}
@@ -171,10 +171,7 @@ replace_nondet(exprt &expr, symex_nondet_generatort &build_symex_nondet)
171171
}
172172
}
173173

174-
void goto_symext::lift_let(
175-
statet &state,
176-
const let_exprt &let_expr,
177-
assignment_typet assignment_type)
174+
void goto_symext::lift_let(statet &state, const let_exprt &let_expr)
178175
{
179176
exprt let_value = let_expr.value();
180177
clean_expr(let_value, state, false);
@@ -188,11 +185,10 @@ void goto_symext::lift_let(
188185
nil_exprt(),
189186
let_value,
190187
value_assignment_guard,
191-
assignment_type);
188+
symex_targett::assignment_typet::HIDDEN);
192189
}
193190

194-
void goto_symext::lift_lets(
195-
statet &state, exprt &rhs, assignment_typet assignment_type)
191+
symex_live_let_variablest goto_symext::lift_lets(statet &state, exprt &rhs)
196192
{
197193
for(auto it = rhs.depth_begin(), itend = rhs.depth_end(); it != itend;)
198194
{
@@ -201,10 +197,10 @@ void goto_symext::lift_lets(
201197
// Visit post-order, so more-local definitions are made before usage:
202198
exprt &replaced_expr = it.mutate();
203199
let_exprt &replaced_let = to_let_expr(replaced_expr);
204-
lift_lets(state, replaced_let.value(), assignment_type);
205-
lift_lets(state, replaced_let.where(), assignment_type);
200+
lift_lets(state, replaced_let.value());
201+
lift_lets(state, replaced_let.where());
206202

207-
lift_let(state, replaced_let, assignment_type);
203+
lift_let(state, replaced_let);
208204
replaced_expr = replaced_let.where();
209205

210206
it.next_sibling_or_parent();
@@ -221,7 +217,7 @@ void goto_symext::clean_expr(
221217
{
222218
replace_nondet(expr, path_storage.build_symex_nondet);
223219
dereference(expr, state, write);
224-
lift_lets(state, expr, symex_targett::assignment_typet::STATE);
220+
lift_lets(state, expr);
225221

226222
// make sure all remaining byte extract operations use the root
227223
// object to avoid nesting of with/update and byte_update when on

0 commit comments

Comments
 (0)