Skip to content

Commit c430ce7

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 be28284 commit c430ce7

File tree

2 files changed

+9
-18
lines changed

2 files changed

+9
-18
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 & 14 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,13 +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,
196-
exprt &rhs,
197-
assignment_typet assignment_type)
191+
symex_live_let_variablest goto_symext::lift_lets(statet &state, exprt &rhs)
198192
{
199193
for(auto it = rhs.depth_begin(), itend = rhs.depth_end(); it != itend;)
200194
{
@@ -203,10 +197,10 @@ void goto_symext::lift_lets(
203197
// Visit post-order, so more-local definitions are made before usage:
204198
exprt &replaced_expr = it.mutate();
205199
let_exprt &replaced_let = to_let_expr(replaced_expr);
206-
lift_lets(state, replaced_let.value(), assignment_type);
207-
lift_lets(state, replaced_let.where(), assignment_type);
200+
lift_lets(state, replaced_let.value());
201+
lift_lets(state, replaced_let.where());
208202

209-
lift_let(state, replaced_let, assignment_type);
203+
lift_let(state, replaced_let);
210204
replaced_expr = replaced_let.where();
211205

212206
it.next_sibling_or_parent();
@@ -223,7 +217,7 @@ void goto_symext::clean_expr(
223217
{
224218
replace_nondet(expr, path_storage.build_symex_nondet);
225219
dereference(expr, state, write);
226-
lift_lets(state, expr, symex_targett::assignment_typet::STATE);
220+
lift_lets(state, expr);
227221

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

0 commit comments

Comments
 (0)