Skip to content

Commit a3fe467

Browse files
Merge the two rename_ssa functions
We merge rename_level0_ssa and rename_level1_ssa in one template rename_ssa<level> since the code is similar and their usage would be similar.
1 parent 3726631 commit a3fe467

8 files changed

+39
-30
lines changed

src/goto-symex/goto_symex_state.cpp

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ void goto_symex_statet::assignment(
163163
bool allow_pointer_unsoundness)
164164
{
165165
// identifier should be l0 or l1, make sure it's l1
166-
lhs = rename_level1_ssa(std::move(lhs), ns);
166+
lhs = rename_ssa<L1>(std::move(lhs), ns);
167167
irep_idt l1_identifier=lhs.get_identifier();
168168

169169
// the type might need renaming
@@ -263,24 +263,29 @@ void goto_symex_statet::set_l2_indices(
263263
ssa_expr.set_level_2(level2.current_count(ssa_expr.get_identifier()));
264264
}
265265

266-
ssa_exprt
267-
goto_symex_statet::rename_level0_ssa(ssa_exprt ssa, const namespacet &ns)
266+
template <goto_symex_statet::levelt level>
267+
ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
268268
{
269-
set_l0_indices(ssa, ns);
270-
rename<L0>(ssa.type(), ssa.get_identifier(), ns);
271-
ssa.update_type();
272-
return ssa;
273-
}
269+
static_assert(
270+
level == L0 || level == L1,
271+
"rename_ssa can only be used for levels L0 and L1");
272+
if(level == L0)
273+
set_l0_indices(ssa, ns);
274+
else if(level == L1)
275+
set_l1_indices(ssa, ns);
276+
else
277+
UNREACHABLE;
274278

275-
ssa_exprt
276-
goto_symex_statet::rename_level1_ssa(ssa_exprt ssa, const namespacet &ns)
277-
{
278-
set_l1_indices(ssa, ns);
279-
rename<L1>(ssa.type(), ssa.get_identifier(), ns);
279+
rename<level>(ssa.type(), ssa.get_identifier(), ns);
280280
ssa.update_type();
281281
return ssa;
282282
}
283283

284+
/// Ensure `rename_ssa` gets compiled for L0
285+
template ssa_exprt goto_symex_statet::rename_ssa<goto_symex_statet::L0>(
286+
ssa_exprt ssa,
287+
const namespacet &ns);
288+
284289
template <goto_symex_statet::levelt level>
285290
exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
286291
{
@@ -293,11 +298,11 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
293298

294299
if(level == L0)
295300
{
296-
ssa = rename_level0_ssa(std::move(ssa), ns);
301+
ssa = rename_ssa<L0>(std::move(ssa), ns);
297302
}
298303
else if(level == L1)
299304
{
300-
ssa = rename_level1_ssa(std::move(ssa), ns);
305+
ssa = rename_ssa<L1>(std::move(ssa), ns);
301306
}
302307
else if(level==L2)
303308
{
@@ -331,8 +336,10 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
331336
// we never rename function symbols
332337
if(as_const(expr).type().id() == ID_code)
333338
rename<level>(expr.type(), to_symbol_expr(expr).get_identifier(), ns);
334-
else
339+
else if(level == L0 || level == L1)
335340
expr = rename<level>(ssa_exprt(expr), ns);
341+
else // No SSA version for level2
342+
expr = rename<level>((exprt)ssa_exprt(expr), ns);
336343
}
337344
else if(expr.id()==ID_address_of)
338345
{

src/goto-symex/goto_symex_state.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,10 @@ class goto_symex_statet final : public goto_statet
182182
template <levelt level = L2>
183183
exprt rename(exprt expr, const namespacet &ns);
184184

185-
ssa_exprt rename_level0_ssa(ssa_exprt ssa, const namespacet &ns);
186-
187-
ssa_exprt rename_level1_ssa(ssa_exprt ssa, const namespacet &ns);
185+
/// Version of rename which is specialized for SSA exprt.
186+
/// Implementation only exists for level L0 and L1.
187+
template <levelt level>
188+
ssa_exprt rename_ssa(ssa_exprt ssa, const namespacet &ns);
188189

189190
template <levelt level = L2>
190191
void rename(typet &type, const irep_idt &l1_identifier, const namespacet &ns);

src/goto-symex/symex_dead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +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 = state.rename_level1_ssa(ssa_exprt{code.symbol()}, ns);
29+
ssa_exprt ssa = state.rename_ssa<statet::L1>(ssa_exprt{code.symbol()}, ns);
3030

3131
// in case of pointers, put something into the value set
3232
if(code.symbol().type().id() == ID_pointer)

src/goto-symex/symex_decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ 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 = state.rename_level1_ssa(ssa_exprt{expr}, ns);
40+
ssa_exprt ssa = state.rename_ssa<statet::L1>(ssa_exprt{expr}, ns);
4141
const irep_idt &l1_identifier = ssa.get_identifier();
4242

4343
// rename type to L2

src/goto-symex/symex_dereference_state.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
5050
{
5151
symbolt sym=*symbol;
5252
symbolt *sym_ptr=nullptr;
53-
const ssa_exprt sym_expr =
54-
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
53+
const ssa_exprt sym_expr = state.rename_ssa<goto_symex_statet::L1>(
54+
ssa_exprt{sym.symbol_expr()}, ns);
5555
sym.name = sym_expr.get_identifier();
5656
state.symbol_table.move(sym, sym_ptr);
5757
return sym_ptr;
@@ -70,8 +70,8 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
7070
{
7171
symbolt sym=*symbol;
7272
symbolt *sym_ptr=nullptr;
73-
const ssa_exprt sym_expr =
74-
state.rename_level1_ssa(ssa_exprt{sym.symbol_expr()}, ns);
73+
const ssa_exprt sym_expr = state.rename_ssa<goto_symex_statet::L1>(
74+
ssa_exprt{sym.symbol_expr()}, ns);
7575
sym.name = sym_expr.get_identifier();
7676
state.symbol_table.move(sym, sym_ptr);
7777
return sym_ptr;

src/goto-symex/symex_function_call.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,8 @@ static void locality(
395395
it++)
396396
{
397397
// get L0 name
398-
ssa_exprt ssa =
399-
state.rename_level0_ssa(ssa_exprt(ns.lookup(*it).symbol_expr()), ns);
398+
ssa_exprt ssa = state.rename_ssa<goto_symex_statet::L0>(
399+
ssa_exprt(ns.lookup(*it).symbol_expr()), ns);
400400
const irep_idt l0_name=ssa.get_identifier();
401401

402402
// save old L1 name for popping the frame
@@ -418,7 +418,8 @@ static void locality(
418418
// identifiers may be shared among functions
419419
// (e.g., due to inlining or other code restructuring)
420420

421-
ssa_exprt ssa_l1 = state.rename_level1_ssa(std::move(ssa), ns);
421+
ssa_exprt ssa_l1 =
422+
state.rename_ssa<goto_symex_statet::L1>(std::move(ssa), ns);
422423

423424
irep_idt l1_name = ssa_l1.get_identifier();
424425
unsigned offset=0;

src/goto-symex/symex_goto.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void goto_symext::symex_goto(statet &state)
248248
exprt new_rhs = boolean_negate(new_guard);
249249

250250
ssa_exprt new_lhs =
251-
state.rename_level1_ssa(ssa_exprt{guard_symbol_expr}, ns);
251+
state.rename_ssa<statet::L1>(ssa_exprt{guard_symbol_expr}, ns);
252252
state.assignment(new_lhs, new_rhs, ns, true, false);
253253

254254
guardt guard{true_exprt{}};

src/goto-symex/symex_start_thread.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void goto_symext::symex_start_thread(statet &state)
7373
std::forward_as_tuple(lhs.get_l1_object_identifier()),
7474
std::forward_as_tuple(lhs, 0));
7575
CHECK_RETURN(emplace_result.second);
76-
const ssa_exprt lhs_l1 = state.rename_level1_ssa(std::move(lhs), ns);
76+
const ssa_exprt lhs_l1 = state.rename_ssa<statet::L1>(std::move(lhs), ns);
7777
const irep_idt l1_name = lhs_l1.get_l1_object_identifier();
7878
// store it
7979
state.l1_history.insert(l1_name);

0 commit comments

Comments
 (0)