Skip to content

Commit d52823b

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 ae2d5ee commit d52823b

9 files changed

+50
-60
lines changed

src/goto-instrument/accelerate/scratch_program.cpp

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

7070
exprt scratch_programt::eval(const exprt &e)
7171
{
72-
exprt ssa=e;
73-
74-
symex_state->rename_level2(ssa, ns);
75-
76-
return checker->get(ssa);
72+
return checker->get(symex_state->rename_level2(e, ns));
7773
}
7874

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

src/goto-symex/goto_symex_state.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ exprt goto_symex_statet::rename_level2_ssa(ssa_exprt ssa, const namespacet &ns)
399399
return ssa;
400400
}
401401

402-
void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
402+
exprt goto_symex_statet::rename_level2(exprt expr, const namespacet &ns)
403403
{
404404
// rename all the symbols with their last known value
405405
renaming_strategyt strategy;
@@ -415,6 +415,7 @@ void goto_symex_statet::rename_level2(exprt &expr, const namespacet &ns)
415415
rename(type, irep_idt(), ns, L2);
416416
};
417417
::rename(expr, strategy, ns);
418+
return expr;
418419
}
419420

420421
/// thread encoding
@@ -604,7 +605,7 @@ void goto_symex_statet::rename_address(
604605
if(level == L1)
605606
e = rename_level1(e, ns);
606607
else
607-
rename_level2(e, ns);
608+
e = rename_level2(e, ns);
608609
};
609610

610611
if(expr.id()==ID_symbol &&
@@ -752,7 +753,7 @@ void goto_symex_statet::rename(
752753
else if(level == L1)
753754
e = rename_level1(std::move(e), ns);
754755
else
755-
rename_level2(e, ns);
756+
e = rename_level2(e, ns);
756757
};
757758

758759
// rename all the symbols with their last known value

src/goto-symex/goto_symex_state.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class goto_symex_statet final : public goto_statet
183183
ssa_exprt rename_level1_ssa(ssa_exprt expr, const namespacet &ns);
184184
exprt rename_level1(exprt expr, const namespacet &ns);
185185
exprt rename_level2_ssa(ssa_exprt expr, const namespacet &ns);
186-
void rename_level2(exprt &expr, const namespacet &ns);
186+
exprt rename_level2(exprt expr, const namespacet &ns);
187187
void rename(
188188
typet &type,
189189
const irep_idt &l1_identifier,

src/goto-symex/symex_assign.cpp

Lines changed: 8 additions & 8 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,8 +254,9 @@ 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()),
258-
ssa_rhs,
257+
l2_full_lhs,
258+
add_to_lhs(full_lhs, ssa_lhs.get_original_expr()),
259+
l2_rhs,
259260
state.source,
260261
assignment_type);
261262
}
@@ -406,8 +407,7 @@ void goto_symext::symex_assign_if(
406407

407408
guardt old_guard=guard;
408409

409-
exprt renamed_guard=lhs.cond();
410-
state.rename_level2(renamed_guard, ns);
410+
exprt renamed_guard = state.rename_level2(lhs.cond(), ns);
411411
do_simplify(renamed_guard);
412412

413413
if(!renamed_guard.is_false())

src/goto-symex/symex_builtin_functions.cpp

Lines changed: 22 additions & 30 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
@@ -91,10 +91,10 @@ void goto_symext::symex_allocate(
9191
tmp_size.operands().size() == 2 &&
9292
(tmp_size.op0().is_constant() || tmp_size.op1().is_constant()))
9393
{
94-
exprt s=tmp_size.op0();
94+
exprt s = tmp_size.op0();
9595
if(s.is_constant())
9696
{
97-
s=tmp_size.op1();
97+
s = tmp_size.op1();
9898
PRECONDITION(*c_sizeof_type_rec(tmp_size.op0()) == *tmp_type);
9999
}
100100
else
@@ -135,7 +135,7 @@ void goto_symext::symex_allocate(
135135
size_symbol.base_name=
136136
"dynamic_object_size"+std::to_string(dynamic_counter);
137137
size_symbol.name="symex_dynamic::"+id2string(size_symbol.base_name);
138-
size_symbol.type=tmp_size.type();
138+
size_symbol.type = tmp_size.type();
139139
size_symbol.mode = mode;
140140
size_symbol.type.set(ID_C_constant, true);
141141
size_symbol.value = array_size;
@@ -161,8 +161,8 @@ void goto_symext::symex_allocate(
161161

162162
state.symbol_table.add(value_symbol);
163163

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

168168
INVARIANT(
@@ -230,10 +230,10 @@ void goto_symext::symex_gcc_builtin_va_arg_next(
230230
if(lhs.is_nil())
231231
return; // ignore
232232

233-
exprt tmp=code.op0();
234-
state.rename_level2(tmp, ns); // to allow constant propagation
233+
// to allow constant propagation
234+
exprt tmp = state.rename_level2(code.op0(), ns);
235235
do_simplify(tmp);
236-
irep_idt id=get_symbol(tmp);
236+
irep_idt id = get_symbol(tmp);
237237

238238
const auto zero = zero_initializer(lhs.type(), code.source_location(), ns);
239239
CHECK_RETURN(zero.has_value());
@@ -308,11 +308,10 @@ void goto_symext::symex_printf(
308308
{
309309
PRECONDITION(!rhs.operands().empty());
310310

311-
exprt tmp_rhs=rhs;
312-
state.rename_level2(tmp_rhs, ns);
311+
exprt tmp_rhs = state.rename_level2(rhs, ns);
313312
do_simplify(tmp_rhs);
314313

315-
const exprt::operandst &operands=tmp_rhs.operands();
314+
const exprt::operandst &operands = tmp_rhs.operands();
316315
std::list<exprt> args;
317316

318317
for(std::size_t i=1; i<operands.size(); i++)
@@ -333,20 +332,19 @@ void goto_symext::symex_input(
333332
{
334333
PRECONDITION(code.operands().size() >= 2);
335334

336-
exprt id_arg=code.op0();
337-
338-
state.rename_level2(id_arg, ns);
335+
exprt id_arg = state.rename_level2(code.op0(), ns);
339336

340337
std::list<exprt> args;
341338

342339
for(std::size_t i=1; i<code.operands().size(); i++)
343340
{
344341
args.push_back(code.operands()[i]);
345-
state.rename_level2(args.back(), ns);
346-
do_simplify(args.back());
342+
exprt l2_arg = state.rename_level2(args.back(), ns);
343+
do_simplify(l2_arg);
344+
args.back() = std::move(l2_arg);
347345
}
348346

349-
const irep_idt input_id=get_string_argument(id_arg, ns);
347+
const irep_idt input_id = get_string_argument(id_arg, ns);
350348

351349
target.input(state.guard.as_expr(), state.source, input_id, args);
352350
}
@@ -356,18 +354,16 @@ void goto_symext::symex_output(
356354
const codet &code)
357355
{
358356
PRECONDITION(code.operands().size() >= 2);
359-
360-
exprt id_arg=code.op0();
361-
362-
state.rename_level2(id_arg, ns);
357+
exprt id_arg = state.rename_level2(code.op0(), ns);
363358

364359
std::list<exprt> args;
365360

366361
for(std::size_t i=1; i<code.operands().size(); i++)
367362
{
368363
args.push_back(code.operands()[i]);
369-
state.rename_level2(args.back(), ns);
370-
do_simplify(args.back());
364+
exprt l2_arg = state.rename_level2(args.back(), ns);
365+
do_simplify(l2_arg);
366+
args.back() = std::move(l2_arg);
371367
}
372368

373369
const irep_idt output_id=get_string_argument(id_arg, ns);
@@ -478,11 +474,7 @@ void goto_symext::symex_trace(
478474
irep_idt event = to_string_constant(code.arguments()[1].op0()).get_value();
479475

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

487479
target.output(state.guard.as_expr(), state.source, event, vars);
488480
}

src/goto-symex/symex_decl.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,11 @@ 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+
exprt expr_l2 = state.rename_level2_ssa(std::move(ssa), ns);
73+
INVARIANT(
74+
expr_l2.id() == ID_symbol && expr_l2.get_bool(ID_C_SSA_symbol),
75+
"symbol to declare should not be replaced by constant propagation");
76+
ssa = to_ssa_expr(expr_l2);
7377
state.record_events=record_events;
7478

7579
// 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
@@ -272,7 +272,7 @@ void goto_symext::symex_function_call_code(
272272
// read the arguments -- before the locality renaming
273273
exprt::operandst arguments = call.arguments();
274274
for(auto &a : arguments)
275-
state.rename_level2(a, ns);
275+
a = state.rename_level2(std::move(a), ns);
276276

277277
// we hide the call if the caller and callee are both hidden
278278
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())
@@ -269,8 +268,7 @@ void goto_symext::symex_goto(statet &state)
269268
original_source,
270269
symex_targett::assignment_typet::GUARD);
271270

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

276274
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)