Skip to content

Commit 08d4743

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 1653959 commit 08d4743

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
@@ -174,7 +174,7 @@ void goto_symex_statet::assignment(
174174
bool allow_pointer_unsoundness)
175175
{
176176
// identifier should be l0 or l1, make sure it's l1
177-
rename_level1(lhs, ns);
177+
lhs = rename_level1_ssa(std::move(lhs), ns);
178178
irep_idt l1_identifier=lhs.get_identifier();
179179

180180
// the type might need renaming
@@ -330,31 +330,38 @@ goto_symex_statet::rename_level0(const symbol_exprt &expr, const namespacet &ns)
330330
return ssa;
331331
}
332332

333-
void goto_symex_statet::rename_level1(exprt &expr, const namespacet &ns)
333+
ssa_exprt goto_symex_statet::rename_level1_ssa(
334+
ssa_exprt ssa, const namespacet &ns)
335+
{
336+
set_l1_indices(level0, level1, ssa, source.thread_nr, ns);
337+
rename(ssa.type(), ssa.get_identifier(), ns, L1);
338+
ssa.update_type();
339+
return ssa;
340+
}
341+
342+
exprt goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
334343
{
335344
// rename all the symbols with their last known value
336345
if(auto ssa = expr_try_dynamic_cast<ssa_exprt>(expr))
337346
{
338-
set_l1_indices(level0, level1, *ssa, source.thread_nr, ns);
339-
rename(expr.type(), ssa->get_identifier(), ns, L1);
340-
ssa->update_type();
347+
return rename_level1_ssa(*ssa, ns);
341348
}
342349
else if(expr.id() == ID_symbol)
343350
{
344351
// we never rename function symbols
345352
if(expr.type().id() == ID_code)
346353
{
347354
rename(expr.type(), to_symbol_expr(expr).get_identifier(), ns, L1);
348-
return;
355+
return expr;
349356
}
350357

351-
expr = ssa_exprt(expr);
352-
rename_level1(expr, ns);
358+
return rename_level1_ssa(ssa_exprt{expr}, ns);
353359
}
354360
else if(auto address_of_expr = expr_try_dynamic_cast<address_of_exprt>(expr))
355361
{
356362
rename_address(address_of_expr->object(), ns, L1);
357363
to_pointer_type(expr.type()).subtype() = address_of_expr->object().type();
364+
return expr;
358365
}
359366
else
360367
{
@@ -363,9 +370,10 @@ void goto_symex_statet::rename_level1(exprt &expr, const namespacet &ns)
363370

364371
// do this recursively
365372
for(auto &op : expr.operands())
366-
rename_level1(op, ns);
373+
op = rename_level1(std::move(op), ns);
367374

368375
fix_type(expr);
376+
return expr;
369377
}
370378
}
371379

@@ -625,7 +633,7 @@ void goto_symex_statet::rename_address(
625633
PRECONDITION(level != L0);
626634
auto rename_expr = [&](exprt &e) {
627635
if(level == L1)
628-
rename_level1(e, ns);
636+
e = rename_level1(e, ns);
629637
else
630638
rename_level2(e, ns);
631639
};
@@ -729,7 +737,7 @@ void goto_symex_statet::rename(
729737
if(level == L0)
730738
e = rename_level0(std::move(e), ns);
731739
if(level == L1)
732-
rename_level1(e, ns);
740+
e = rename_level1(e, ns);
733741
else
734742
rename_level2(e, ns);
735743
};

src/goto-symex/goto_symex_state.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class goto_symex_statet final
7272

7373
// performs renaming _up to_ the given level
7474
ssa_exprt rename_level0(const symbol_exprt &expr, const namespacet &ns);
75-
void rename_level1(exprt &expr, const namespacet &ns);
75+
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
76+
exprt rename_level1(exprt expr, const namespacet &ns);
7677
void rename_level2(exprt &expr, const namespacet &ns);
7778
void rename(
7879
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(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)