Skip to content

Commit e6b2e48

Browse files
rename_level1 takes a copy instead of reference
This makes the interface clearer as there is no argument that is both an input and an output. This also corresponds to how the function was used in a lot of occurences, in which case the code is now simpler. In the cases where we actually what the transformation to happen in-place, we can use std::move. As a side effect we have to define a version that returns a ssa_exprt as exprt is sometimes not precise enough.
1 parent e3c9069 commit e6b2e48

6 files changed

+43
-41
lines changed

src/goto-symex/goto_symex_state.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ void goto_symex_statet::assignment(
168168
bool allow_pointer_unsoundness)
169169
{
170170
// identifier should be l0 or l1, make sure it's l1
171-
rename_level1(lhs, ns);
171+
lhs = rename_level1_ssa(std::move(lhs), ns);
172172
irep_idt l1_identifier=lhs.get_identifier();
173173

174174
// the type might need renaming
@@ -324,31 +324,38 @@ goto_symex_statet::rename_level0(const symbol_exprt &expr, const namespacet &ns)
324324
return ssa;
325325
}
326326

327-
void goto_symex_statet::rename_level1(exprt &expr, const namespacet &ns)
327+
ssa_exprt goto_symex_statet::rename_level1_ssa(
328+
ssa_exprt ssa, const namespacet &ns)
329+
{
330+
set_l1_indices(level0, level1, ssa, source.thread_nr, ns);
331+
rename(ssa.type(), ssa.get_identifier(), ns, L1);
332+
ssa.update_type();
333+
return ssa;
334+
}
335+
336+
exprt goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
328337
{
329338
// rename all the symbols with their last known value
330339
if(auto ssa = expr_try_dynamic_cast<ssa_exprt>(expr))
331340
{
332-
set_l1_indices(level0, level1, *ssa, source.thread_nr, ns);
333-
rename(expr.type(), ssa->get_identifier(), ns, L1);
334-
ssa->update_type();
341+
return rename_level1_ssa(*ssa, ns);
335342
}
336343
else if(expr.id() == ID_symbol)
337344
{
338345
// we never rename function symbols
339346
if(expr.type().id() == ID_code)
340347
{
341348
rename(expr.type(), to_symbol_expr(expr).get_identifier(), ns, L1);
342-
return;
349+
return expr;
343350
}
344351

345-
expr = ssa_exprt(expr);
346-
rename_level1(expr, ns);
352+
return rename_level1_ssa(ssa_exprt{expr}, ns);
347353
}
348354
else if(auto address_of_expr = expr_try_dynamic_cast<address_of_exprt>(expr))
349355
{
350356
rename_address(address_of_expr->object(), ns, L1);
351357
to_pointer_type(expr.type()).subtype() = address_of_expr->object().type();
358+
return expr;
352359
}
353360
else
354361
{
@@ -357,9 +364,10 @@ void goto_symex_statet::rename_level1(exprt &expr, const namespacet &ns)
357364

358365
// do this recursively
359366
for(auto &op : expr.operands())
360-
rename_level1(op, ns);
367+
op = rename_level1(std::move(op), ns);
361368

362369
fix_type(expr);
370+
return expr;
363371
}
364372
}
365373

@@ -618,7 +626,7 @@ void goto_symex_statet::rename_address(
618626
PRECONDITION(level != L0);
619627
auto rename_expr = [&](exprt &e) {
620628
if(level == L1)
621-
rename_level1(e, ns);
629+
e = rename_level1(e, ns);
622630
else
623631
rename_level2(e, ns);
624632
};
@@ -722,7 +730,7 @@ void goto_symex_statet::rename(
722730
if(level == L0)
723731
e = rename_level0(std::move(e), ns);
724732
if(level == L1)
725-
rename_level1(e, ns);
733+
e = rename_level1(e, ns);
726734
else
727735
rename_level2(e, ns);
728736
};

src/goto-symex/goto_symex_state.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ class goto_symex_statet final : public goto_statet
177177
/// A full explanation of SSA (which is why we do this renaming) is in
178178
/// the SSA section of background-concepts.md.
179179
ssa_exprt rename_level0(const symbol_exprt &expr, const namespacet &ns);
180-
void rename_level1(exprt &expr, const namespacet &ns);
180+
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
181+
exprt rename_level1(exprt expr, const namespacet &ns);
181182
void rename_level2(exprt &expr, const namespacet &ns);
182183
void rename(
183184
typet &type,

src/goto-symex/symex_dead.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ void goto_symext::symex_dead(statet &state)
2626
// We increase the L2 renaming to make these non-deterministic.
2727
// We also prevent propagation of old values.
2828

29-
ssa_exprt ssa(code.symbol());
30-
state.rename_level1(ssa, ns);
29+
ssa_exprt ssa = state.rename_level1_ssa(ssa_exprt{code.symbol()}, ns);
3130

3231
// in case of pointers, put something into the value set
3332
if(code.symbol().type().id() == ID_pointer)
@@ -38,12 +37,11 @@ void goto_symext::symex_dead(statet &state)
3837
return exprt(ID_invalid);
3938
}();
4039

41-
state.rename_level1(rhs, ns);
42-
state.value_set.assign(ssa, rhs, ns, true, false);
40+
exprt l1_rhs = state.rename_level1(std::move(rhs), ns);
41+
state.value_set.assign(ssa, l1_rhs, ns, true, false);
4342
}
4443

45-
ssa_exprt ssa_lhs=to_ssa_expr(ssa);
46-
const irep_idt &l1_identifier=ssa_lhs.get_identifier();
44+
const irep_idt &l1_identifier = ssa.get_identifier();
4745

4846
// prevent propagation
4947
state.propagation.erase(l1_identifier);

src/goto-symex/symex_decl.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
3737
// We increase the L2 renaming to make these non-deterministic.
3838
// We also prevent propagation of old values.
3939

40-
ssa_exprt ssa(expr);
41-
state.rename_level1(ssa, ns);
42-
const irep_idt &l1_identifier=ssa.get_identifier();
40+
ssa_exprt ssa = state.rename_level1_ssa(ssa_exprt{expr}, ns);
41+
const irep_idt &l1_identifier = ssa.get_identifier();
4342

4443
// rename type to L2
4544
state.rename(ssa.type(), l1_identifier, ns);
@@ -54,8 +53,8 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
5453
return exprt(ID_invalid);
5554
}();
5655

57-
state.rename_level1(rhs, ns);
58-
state.value_set.assign(ssa, rhs, ns, true, false);
56+
exprt l1_rhs = state.rename_level1(std::move(rhs), ns);
57+
state.value_set.assign(ssa, l1_rhs, ns, true, false);
5958
}
6059

6160
// prevent propagation
@@ -64,9 +63,9 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6463
// L2 renaming
6564
// inlining may yield multiple declarations of the same identifier
6665
// within the same L1 context
67-
const auto level2_it =
68-
state.level2.current_names.emplace(l1_identifier, std::make_pair(ssa, 0))
69-
.first;
66+
const auto level2_it = state.level2.current_names
67+
.emplace(l1_identifier, std::make_pair(ssa, 0))
68+
.first;
7069
symex_renaming_levelt::increase_counter(level2_it);
7170
const bool record_events=state.record_events;
7271
state.record_events=false;
@@ -84,14 +83,10 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
8483
state.guard.as_expr(),
8584
ssa,
8685
state.source,
87-
hidden?
88-
symex_targett::assignment_typet::HIDDEN:
89-
symex_targett::assignment_typet::STATE);
86+
hidden ? symex_targett::assignment_typet::HIDDEN
87+
: symex_targett::assignment_typet::STATE);
9088

9189
if(state.dirty(ssa.get_object_name()) && state.atomic_section_id == 0)
9290
target.shared_write(
93-
state.guard.as_expr(),
94-
ssa,
95-
state.atomic_section_id,
96-
state.source);
91+
state.guard.as_expr(), ssa, state.atomic_section_id, state.source);
9792
}

src/goto-symex/symex_dereference_state.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ bool symex_dereference_statet::has_failed_symbol(
3636
{
3737
symbolt sym=*symbol;
3838
symbolt *sym_ptr=nullptr;
39-
symbol_exprt sym_expr=sym.symbol_expr();
40-
state.rename_level1(sym_expr, ns);
41-
sym.name=to_ssa_expr(sym_expr).get_identifier();
39+
const ssa_exprt sym_expr =
40+
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
41+
sym.name = sym_expr.get_identifier();
4242
state.symbol_table.move(sym, sym_ptr);
4343
symbol=sym_ptr;
4444
return true;
@@ -56,9 +56,9 @@ bool symex_dereference_statet::has_failed_symbol(
5656
{
5757
symbolt sym=*symbol;
5858
symbolt *sym_ptr=nullptr;
59-
symbol_exprt sym_expr=sym.symbol_expr();
60-
state.rename_level1(sym_expr, ns);
61-
sym.name=to_ssa_expr(sym_expr).get_identifier();
59+
const ssa_exprt sym_expr =
60+
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
61+
sym.name = sym_expr.get_identifier();
6262
state.symbol_table.move(sym, sym_ptr);
6363
symbol=sym_ptr;
6464
return true;

src/goto-symex/symex_goto.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,8 @@ void goto_symext::symex_goto(statet &state)
247247
symbol_exprt(statet::guard_identifier(), bool_typet());
248248
exprt new_rhs = boolean_negate(new_guard);
249249

250-
ssa_exprt new_lhs(guard_symbol_expr);
251-
state.rename_level1(new_lhs, ns);
250+
ssa_exprt new_lhs =
251+
state.rename_level1_ssa(ssa_exprt{guard_symbol_expr}, ns);
252252
state.assignment(new_lhs, new_rhs, ns, true, false);
253253

254254
guardt guard{true_exprt{}};

0 commit comments

Comments
 (0)