Skip to content

Commit 4fe31a8

Browse files
rename_level2 takes a copy instead of reference
Similar changes to the previous commit but for level2. 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 e6b2e48 commit 4fe31a8

9 files changed

+81
-65
lines changed

src/goto-instrument/accelerate/scratch_program.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ bool scratch_programt::check_sat(bool do_slice)
6262

6363
exprt scratch_programt::eval(const exprt &e)
6464
{
65-
exprt ssa=e;
66-
67-
symex_state.rename_level2(ssa, ns);
68-
69-
return checker->get(ssa);
65+
return checker->get(symex_state.rename_level2(e, ns));
7066
}
7167

7268
void scratch_programt::append(goto_programt::instructionst &new_instructions)

src/goto-symex/goto_symex_state.cpp

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,36 @@ exprt goto_symex_statet::rename_level1(exprt expr, const namespacet &ns)
371371
}
372372
}
373373

374-
void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
374+
ssa_exprt
375+
goto_symex_statet::rename_level2_ssa(ssa_exprt ssa, const namespacet &ns)
376+
{
377+
set_l1_indices(level0, level1, ssa, source.thread_nr, ns);
378+
rename(ssa.type(), ssa.get_identifier(), ns);
379+
ssa.update_type();
380+
381+
if(l2_thread_read_encoding(ssa, ns))
382+
{
383+
// renaming taken care of by l2_thread_encoding
384+
}
385+
else if(!ssa.get_level_2().empty())
386+
{
387+
// already at L2
388+
}
389+
else
390+
{
391+
// We also consider propagation if we go up to L2.
392+
// L1 identifiers are used for propagation!
393+
auto p_it = propagation.find(ssa.get_identifier());
394+
395+
if(p_it != propagation.end())
396+
ssa = to_ssa_expr(p_it->second); // already L2
397+
else
398+
set_l2_indices(level0, level1, level2, ssa, source.thread_nr, ns);
399+
}
400+
return ssa;
401+
}
402+
403+
exprt goto_symex_statet::rename_level2(exprt expr, const namespacet &ns)
375404
{
376405
// rename all the symbols with their last known value
377406
if(expr.id()==ID_symbol &&
@@ -408,12 +437,11 @@ void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
408437
if(expr.type().id() == ID_code)
409438
{
410439
rename(expr.type(), to_symbol_expr(expr).get_identifier(), ns, L2);
411-
412-
return;
413440
}
414-
415-
expr=ssa_exprt(expr);
416-
rename_level2(expr, ns);
441+
else
442+
{
443+
return rename_level2_ssa(ssa_exprt{expr}, ns);
444+
}
417445
}
418446
else if(expr.id()==ID_address_of)
419447
{
@@ -427,7 +455,7 @@ void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
427455

428456
// do this recursively
429457
Forall_operands(it, expr)
430-
rename_level2(*it, ns);
458+
*it = rename_level2(std::move(*it), ns);
431459

432460
INVARIANT(
433461
(expr.id() != ID_with ||
@@ -438,6 +466,7 @@ void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
438466
"Type of renamed expr should be the same as operands for with_exprt and "
439467
"if_exprt");
440468
}
469+
return expr;
441470
}
442471

443472
/// thread encoding

src/goto-symex/goto_symex_state.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ class goto_symex_statet final : public goto_statet
179179
ssa_exprt rename_level0(const symbol_exprt &expr, const namespacet &ns);
180180
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
181181
exprt rename_level1(exprt expr, const namespacet &ns);
182-
void rename_level2(exprt &expr, const namespacet &ns);
182+
ssa_exprt rename_level2_ssa(ssa_exprt expr, const namespacet &ns);
183+
exprt rename_level2(exprt expr, const namespacet &ns);
183184
void rename(
184185
typet &type,
185186
const irep_idt &l1_identifier,

src/goto-symex/symex_assign.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,13 @@ void goto_symext::symex_assign_symbol(
212212
tmp_ssa_rhs.swap(ssa_rhs);
213213
}
214214

215-
state.rename_level2(ssa_rhs, ns);
216-
do_simplify(ssa_rhs);
215+
exprt l2_rhs = state.rename_level2(std::move(ssa_rhs), ns);
216+
do_simplify(l2_rhs);
217217

218218
ssa_exprt ssa_lhs=lhs;
219219
state.assignment(
220220
ssa_lhs,
221-
ssa_rhs,
221+
l2_rhs,
222222
ns,
223223
symex_config.simplify_opt,
224224
symex_config.constant_propagation,
@@ -228,7 +228,7 @@ void goto_symext::symex_assign_symbol(
228228
ssa_full_lhs=add_to_lhs(ssa_full_lhs, ssa_lhs);
229229
const bool record_events=state.record_events;
230230
state.record_events=false;
231-
state.rename_level2(ssa_full_lhs, ns);
231+
exprt l2_full_lhs = state.rename_level2(std::move(ssa_full_lhs), ns);
232232
state.record_events=record_events;
233233

234234
guardt tmp_guard(state.guard);
@@ -254,7 +254,7 @@ void goto_symext::symex_assign_symbol(
254254
target.assignment(
255255
tmp_guard.as_expr(),
256256
ssa_lhs,
257-
ssa_full_lhs, add_to_lhs(full_lhs, ssa_lhs.get_original_expr()),
257+
l2_full_lhs, add_to_lhs(full_lhs, ssa_lhs.get_original_expr()),
258258
ssa_rhs,
259259
state.source,
260260
assignment_type);
@@ -407,8 +407,7 @@ void goto_symext::symex_assign_if(
407407

408408
guardt old_guard=guard;
409409

410-
exprt renamed_guard=lhs.cond();
411-
state.rename_level2(renamed_guard, ns);
410+
exprt renamed_guard = state.rename_level2(lhs.cond(), ns);
412411
do_simplify(renamed_guard);
413412

414413
if(!renamed_guard.is_false())

src/goto-symex/symex_builtin_functions.cpp

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ void goto_symext::symex_allocate(
6969
}
7070
else
7171
{
72-
exprt tmp_size=size;
73-
state.rename_level2(tmp_size, ns); // to allow constant propagation
72+
// to allow constant propagation
73+
exprt tmp_size = state.rename_level2(size, ns);
7474
simplify(tmp_size, ns);
7575

7676
// special treatment for sizeof(T)*x
@@ -89,12 +89,13 @@ void goto_symext::symex_allocate(
8989
else if(
9090
!alloc_size.has_value() && tmp_size.id() == ID_mult &&
9191
tmp_size.operands().size() == 2 &&
92-
(tmp_size.op0().is_constant() || tmp_size.op1().is_constant()))
92+
(tmp_size.op0().is_constant() ||
93+
tmp_size.op1().is_constant()))
9394
{
94-
exprt s=tmp_size.op0();
95+
exprt s = tmp_size.op0();
9596
if(s.is_constant())
9697
{
97-
s=tmp_size.op1();
98+
s = tmp_size.op1();
9899
PRECONDITION(*c_sizeof_type_rec(tmp_size.op0()) == *tmp_type);
99100
}
100101
else
@@ -135,7 +136,7 @@ void goto_symext::symex_allocate(
135136
size_symbol.base_name=
136137
"dynamic_object_size"+std::to_string(dynamic_counter);
137138
size_symbol.name="symex_dynamic::"+id2string(size_symbol.base_name);
138-
size_symbol.type=tmp_size.type();
139+
size_symbol.type = tmp_size.type();
139140
size_symbol.mode = mode;
140141
size_symbol.type.set(ID_C_constant, true);
141142
size_symbol.value = array_size;
@@ -161,12 +162,13 @@ void goto_symext::symex_allocate(
161162

162163
state.symbol_table.add(value_symbol);
163164

164-
exprt zero_init=code.op1();
165-
state.rename_level2(zero_init, ns); // to allow constant propagation
165+
// to allow constant propagation
166+
exprt zero_init = state.rename_level2(code.op1(), ns);
166167
simplify(zero_init, ns);
167168

168169
INVARIANT(
169-
zero_init.is_constant(), "allocate expects constant as second argument");
170+
zero_init.is_constant(),
171+
"allocate expects constant as second argument");
170172

171173
if(!zero_init.is_zero() && !zero_init.is_false())
172174
{
@@ -231,10 +233,10 @@ void goto_symext::symex_gcc_builtin_va_arg_next(
231233
if(lhs.is_nil())
232234
return; // ignore
233235

234-
exprt tmp=code.op0();
235-
state.rename_level2(tmp, ns); // to allow constant propagation
236+
// to allow constant propagation
237+
exprt tmp = state.rename_level2(code.op0(), ns);
236238
do_simplify(tmp);
237-
irep_idt id=get_symbol(tmp);
239+
irep_idt id = get_symbol(tmp);
238240

239241
const auto zero = zero_initializer(lhs.type(), code.source_location(), ns);
240242
CHECK_RETURN(zero.has_value());
@@ -309,11 +311,10 @@ void goto_symext::symex_printf(
309311
{
310312
PRECONDITION(!rhs.operands().empty());
311313

312-
exprt tmp_rhs=rhs;
313-
state.rename_level2(tmp_rhs, ns);
314+
exprt tmp_rhs = state.rename_level2(rhs, ns);
314315
do_simplify(tmp_rhs);
315316

316-
const exprt::operandst &operands=tmp_rhs.operands();
317+
const exprt::operandst &operands = tmp_rhs.operands();
317318
std::list<exprt> args;
318319

319320
for(std::size_t i=1; i<operands.size(); i++)
@@ -334,20 +335,19 @@ void goto_symext::symex_input(
334335
{
335336
PRECONDITION(code.operands().size() >= 2);
336337

337-
exprt id_arg=code.op0();
338-
339-
state.rename_level2(id_arg, ns);
338+
exprt id_arg = state.rename_level2(code.op0(), ns);
340339

341340
std::list<exprt> args;
342341

343342
for(std::size_t i=1; i<code.operands().size(); i++)
344343
{
345344
args.push_back(code.operands()[i]);
346-
state.rename_level2(args.back(), ns);
347-
do_simplify(args.back());
345+
exprt l2_arg = state.rename_level2(args.back(), ns);
346+
do_simplify(l2_arg);
347+
args.back() = std::move(l2_arg);
348348
}
349349

350-
const irep_idt input_id=get_string_argument(id_arg, ns);
350+
const irep_idt input_id = get_string_argument(id_arg, ns);
351351

352352
target.input(state.guard.as_expr(), state.source, input_id, args);
353353
}
@@ -357,18 +357,16 @@ void goto_symext::symex_output(
357357
const codet &code)
358358
{
359359
PRECONDITION(code.operands().size() >= 2);
360-
361-
exprt id_arg=code.op0();
362-
363-
state.rename_level2(id_arg, ns);
360+
exprt id_arg = state.rename_level2(code.op0(), ns);
364361

365362
std::list<exprt> args;
366363

367364
for(std::size_t i=1; i<code.operands().size(); i++)
368365
{
369366
args.push_back(code.operands()[i]);
370-
state.rename_level2(args.back(), ns);
371-
do_simplify(args.back());
367+
exprt l2_arg = state.rename_level2(args.back(), ns);
368+
do_simplify(l2_arg);
369+
args.back() = std::move(l2_arg);
372370
}
373371

374372
const irep_idt output_id=get_string_argument(id_arg, ns);
@@ -479,11 +477,7 @@ void goto_symext::symex_trace(
479477
irep_idt event = to_string_constant(code.arguments()[1].op0()).get_value();
480478

481479
for(std::size_t j=2; j<code.arguments().size(); j++)
482-
{
483-
exprt var(code.arguments()[j]);
484-
state.rename_level2(var, ns);
485-
vars.push_back(var);
486-
}
480+
vars.push_back(state.rename_level2(code.arguments()[j], ns));
487481

488482
target.output(state.guard.as_expr(), state.source, event, vars);
489483
}

src/goto-symex/symex_decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6969
symex_renaming_levelt::increase_counter(level2_it);
7070
const bool record_events=state.record_events;
7171
state.record_events=false;
72-
state.rename_level2(ssa, ns);
72+
state.rename_level2_ssa(ssa, ns);
7373
state.record_events=record_events;
7474

7575
// we hide the declaration of auxiliary variables

src/goto-symex/symex_function_call.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ void goto_symext::symex_function_call_code(
267267
// read the arguments -- before the locality renaming
268268
exprt::operandst arguments = call.arguments();
269269
for(auto &a : arguments)
270-
state.rename_level2(a, ns);
270+
a = state.rename_level2(std::move(a), ns);
271271

272272
// we hide the call if the caller and callee are both hidden
273273
const bool hidden = state.top().hidden_function && goto_function.is_hidden();

src/goto-symex/symex_goto.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ void goto_symext::symex_goto(statet &state)
3737
exprt old_guard = instruction.get_condition();
3838
clean_expr(old_guard, state, false);
3939

40-
exprt new_guard=old_guard;
41-
state.rename_level2(new_guard, ns);
40+
exprt new_guard = state.rename_level2(old_guard, ns);
4241
do_simplify(new_guard);
4342

4443
if(new_guard.is_false())
@@ -268,8 +267,7 @@ void goto_symext::symex_goto(statet &state)
268267
original_source,
269268
symex_targett::assignment_typet::GUARD);
270269

271-
guard_expr = boolean_negate(guard_symbol_expr);
272-
state.rename_level2(guard_expr, ns);
270+
guard_expr = state.rename_level2(boolean_negate(guard_symbol_expr), ns);
273271
}
274272

275273
if(state.has_saved_jump_target)

src/goto-symex/symex_main.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,18 +95,18 @@ void goto_symext::vcc(
9595
}
9696

9797
// now rename, enables propagation
98-
state.rename_level2(expr, ns);
98+
exprt l2_expr = state.rename_level2(std::move(expr), ns);
9999

100100
// now try simplifier on it
101-
do_simplify(expr);
101+
do_simplify(l2_expr);
102102

103-
if(expr.is_true())
103+
if(l2_expr.is_true())
104104
return;
105105

106-
state.guard.guard_expr(expr);
106+
state.guard.guard_expr(l2_expr);
107107

108108
state.remaining_vccs++;
109-
target.assertion(state.guard.as_expr(), expr, msg, state.source);
109+
target.assertion(state.guard.as_expr(), l2_expr, msg, state.source);
110110
}
111111

112112
void goto_symext::symex_assume(statet &state, const exprt &cond)
@@ -410,8 +410,7 @@ void goto_symext::symex_step(
410410
{
411411
exprt tmp = instruction.get_condition();
412412
clean_expr(tmp, state, false);
413-
state.rename_level2(tmp, ns);
414-
symex_assume(state, tmp);
413+
symex_assume(state, state.rename_level2(std::move(tmp), ns));
415414
}
416415

417416
symex_transition(state);

0 commit comments

Comments
 (0)