Skip to content

Commit 294bab6

Browse files
Merge pull request #4394 from romainbrenguier/refactor/symex-rename-type-2
Make rename return a renamedt<exprt, level>
2 parents 320ef61 + fa227a0 commit 294bab6

17 files changed

+98
-69
lines changed

src/goto-instrument/accelerate/scratch_program.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ bool scratch_programt::check_sat(bool do_slice, guard_managert &guard_manager)
7474

7575
exprt scratch_programt::eval(const exprt &e)
7676
{
77-
return checker->get(symex_state->rename<L2>(e, ns));
77+
return checker->get(symex_state->rename<L2>(e, ns).get());
7878
}
7979

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

src/goto-symex/goto_symex_state.cpp

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ void goto_symex_statet::assignment(
161161
bool allow_pointer_unsoundness)
162162
{
163163
// identifier should be l0 or l1, make sure it's l1
164-
lhs = rename_ssa<L1>(std::move(lhs), ns);
164+
lhs = rename_ssa<L1>(std::move(lhs), ns).get();
165165
irep_idt l1_identifier=lhs.get_identifier();
166166

167167
// the type might need renaming
@@ -230,25 +230,27 @@ void goto_symex_statet::assignment(
230230
}
231231

232232
template <levelt level>
233-
ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
233+
renamedt<ssa_exprt, level>
234+
goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
234235
{
235236
static_assert(
236237
level == L0 || level == L1,
237238
"rename_ssa can only be used for levels L0 and L1");
238239
ssa = set_indices<level>(std::move(ssa), ns).get();
239240
rename<level>(ssa.type(), ssa.get_identifier(), ns);
240241
ssa.update_type();
241-
return ssa;
242+
return renamedt<ssa_exprt, level>{ssa};
242243
}
243244

244245
/// Ensure `rename_ssa` gets compiled for L0
245-
template ssa_exprt
246+
template renamedt<ssa_exprt, L0>
246247
goto_symex_statet::rename_ssa<L0>(ssa_exprt ssa, const namespacet &ns);
247-
template ssa_exprt
248+
template renamedt<ssa_exprt, L1>
248249
goto_symex_statet::rename_ssa<L1>(ssa_exprt ssa, const namespacet &ns);
249250

250251
template <levelt level>
251-
exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
252+
renamedt<exprt, level>
253+
goto_symex_statet::rename(exprt expr, const namespacet &ns)
252254
{
253255
// rename all the symbols with their last known value
254256

@@ -259,11 +261,13 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
259261

260262
if(level == L0)
261263
{
262-
ssa = rename_ssa<L0>(std::move(ssa), ns);
264+
return renamedt<exprt, level>{
265+
std::move(rename_ssa<L0>(std::move(ssa), ns).value)};
263266
}
264267
else if(level == L1)
265268
{
266-
ssa = rename_ssa<L1>(std::move(ssa), ns);
269+
return renamedt<exprt, level>{
270+
std::move(rename_ssa<L1>(std::move(ssa), ns).value)};
267271
}
268272
else if(level==L2)
269273
{
@@ -290,6 +294,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
290294
else
291295
ssa = set_indices<L2>(std::move(ssa), ns).get();
292296
}
297+
return renamedt<exprt, level>(std::move(ssa));
293298
}
294299
}
295300
else if(expr.id()==ID_symbol)
@@ -298,24 +303,28 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
298303

299304
// we never rename function symbols
300305
if(type.id() == ID_code || type.id() == ID_mathematical_function)
306+
{
301307
rename<level>(expr.type(), to_symbol_expr(expr).get_identifier(), ns);
308+
return renamedt<exprt, level>{std::move(expr)};
309+
}
302310
else
303-
expr = rename<level>(ssa_exprt{expr}, ns);
311+
return rename<level>(ssa_exprt{expr}, ns);
304312
}
305313
else if(expr.id()==ID_address_of)
306314
{
307315
auto &address_of_expr = to_address_of_expr(expr);
308316
rename_address<level>(address_of_expr.object(), ns);
309317
to_pointer_type(expr.type()).subtype() =
310318
as_const(address_of_expr).object().type();
319+
return renamedt<exprt, level>{std::move(expr)};
311320
}
312321
else
313322
{
314323
rename<level>(expr.type(), irep_idt(), ns);
315324

316325
// do this recursively
317326
Forall_operands(it, expr)
318-
*it = rename<level>(std::move(*it), ns);
327+
*it = rename<level>(std::move(*it), ns).get();
319328

320329
const exprt &c_expr = as_const(expr);
321330
INVARIANT(
@@ -326,11 +335,12 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
326335
c_expr.type() == to_if_expr(c_expr).false_case().type())),
327336
"Type of renamed expr should be the same as operands for with_exprt and "
328337
"if_exprt");
338+
return renamedt<exprt, level>{std::move(expr)};
329339
}
330-
return expr;
331340
}
332341

333-
template exprt goto_symex_statet::rename<L1>(exprt expr, const namespacet &ns);
342+
template renamedt<exprt, L1>
343+
goto_symex_statet::rename<L1>(exprt expr, const namespacet &ns);
334344

335345
/// thread encoding
336346
bool goto_symex_statet::l2_thread_read_encoding(
@@ -555,13 +565,14 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
555565
expr.type() = to_array_type(index_expr.array().type()).subtype();
556566

557567
// the index is not an address
558-
index_expr.index() = rename<level>(std::move(index_expr.index()), ns);
568+
index_expr.index() =
569+
rename<level>(std::move(index_expr.index()), ns).get();
559570
}
560571
else if(expr.id()==ID_if)
561572
{
562573
// the condition is not an address
563574
if_exprt &if_expr=to_if_expr(expr);
564-
if_expr.cond() = rename<level>(std::move(if_expr.cond()), ns);
575+
if_expr.cond() = rename<level>(std::move(if_expr.cond()), ns).get();
565576
rename_address<level>(if_expr.true_case(), ns);
566577
rename_address<level>(if_expr.false_case(), ns);
567578

@@ -694,7 +705,7 @@ void goto_symex_statet::rename(
694705
{
695706
auto &array_type = to_array_type(type);
696707
rename<level>(array_type.subtype(), irep_idt(), ns);
697-
array_type.size() = rename<level>(std::move(array_type.size()), ns);
708+
array_type.size() = rename<level>(std::move(array_type.size()), ns).get();
698709
}
699710
else if(type.id() == ID_struct || type.id() == ID_union)
700711
{
@@ -707,7 +718,8 @@ void goto_symex_statet::rename(
707718
if(component.type().id() == ID_array)
708719
{
709720
auto &array_type = to_array_type(component.type());
710-
array_type.size() = rename<level>(std::move(array_type.size()), ns);
721+
array_type.size() =
722+
rename<level>(std::move(array_type.size()), ns).get();
711723
}
712724
else if(component.type().id() != ID_pointer)
713725
rename<level>(component.type(), irep_idt(), ns);
@@ -768,7 +780,7 @@ ssa_exprt goto_symex_statet::add_object(
768780
{
769781
framet &frame = call_stack().top();
770782

771-
ssa_exprt ssa = rename_ssa<L0>(ssa_exprt{expr}, ns);
783+
ssa_exprt ssa = rename_ssa<L0>(ssa_exprt{expr}, ns).get();
772784
const irep_idt l0_name = ssa.get_identifier();
773785
const std::size_t l1_index = index_generator(l0_name);
774786

@@ -784,7 +796,7 @@ ssa_exprt goto_symex_statet::add_object(
784796
existing_or_new_entry.first->second = std::make_pair(ssa, l1_index);
785797
}
786798

787-
ssa = rename_ssa<L1>(std::move(ssa), ns);
799+
ssa = rename_ssa<L1>(std::move(ssa), ns).get();
788800
const bool inserted = frame.local_objects.insert(ssa.get_identifier()).second;
789801
INVARIANT(inserted, "l1_name expected to be unique by construction");
790802

src/goto-symex/goto_symex_state.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,12 @@ class goto_symex_statet final : public goto_statet
9696
/// A full explanation of SSA (which is why we do this renaming) is in
9797
/// the SSA section of background-concepts.md.
9898
template <levelt level = L2>
99-
exprt rename(exprt expr, const namespacet &ns);
99+
renamedt<exprt, level> rename(exprt expr, const namespacet &ns);
100100

101101
/// Version of rename which is specialized for SSA exprt.
102102
/// Implementation only exists for level L0 and L1.
103103
template <levelt level>
104-
ssa_exprt rename_ssa(ssa_exprt ssa, const namespacet &ns);
104+
renamedt<ssa_exprt, level> rename_ssa(ssa_exprt ssa, const namespacet &ns);
105105

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

src/goto-symex/renaming_level.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Author: Romain Brenguier, [email protected]
1616
#include <unordered_set>
1717

1818
#include <util/irep.h>
19+
#include <util/simplify_expr.h>
1920
#include <util/ssa_expr.h>
2021

2122
/// Symex renaming level names.
@@ -81,14 +82,20 @@ class renamedt
8182
return value;
8283
}
8384

85+
void simplify(const namespacet &ns)
86+
{
87+
(void)::simplify(value, ns);
88+
}
89+
8490
private:
8591
underlyingt value;
8692

8793
friend struct symex_level0t;
8894
friend struct symex_level1t;
8995
friend struct symex_level2t;
96+
friend class goto_symex_statet;
9097

91-
/// Only symex_levelXt classes can create renamedt objects
98+
/// Only the friend classes can create renamedt objects
9299
explicit renamedt(underlyingt value) : value(std::move(value))
93100
{
94101
}

src/goto-symex/symex_assign.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ void goto_symext::symex_assign_symbol(
215215
tmp_ssa_rhs.swap(ssa_rhs);
216216
}
217217

218-
exprt l2_rhs = state.rename(std::move(ssa_rhs), ns);
218+
exprt l2_rhs = state.rename(std::move(ssa_rhs), ns).get();
219219
do_simplify(l2_rhs);
220220

221221
ssa_exprt ssa_lhs=lhs;
@@ -231,7 +231,7 @@ void goto_symext::symex_assign_symbol(
231231
ssa_full_lhs=add_to_lhs(ssa_full_lhs, ssa_lhs);
232232
const bool record_events=state.record_events;
233233
state.record_events=false;
234-
exprt l2_full_lhs = state.rename(std::move(ssa_full_lhs), ns);
234+
exprt l2_full_lhs = state.rename(std::move(ssa_full_lhs), ns).get();
235235
state.record_events=record_events;
236236

237237
// do the assignment
@@ -410,7 +410,7 @@ void goto_symext::symex_assign_if(
410410
assignment_typet assignment_type)
411411
{
412412
// we have (c?a:b)=e;
413-
exprt renamed_guard = state.rename(lhs.cond(), ns);
413+
exprt renamed_guard = state.rename(lhs.cond(), ns).get();
414414
do_simplify(renamed_guard);
415415

416416
if(!renamed_guard.is_false())

src/goto-symex/symex_builtin_functions.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void goto_symext::symex_allocate(
7272
else
7373
{
7474
// to allow constant propagation
75-
exprt tmp_size = state.rename(size, ns);
75+
exprt tmp_size = state.rename(size, ns).get();
7676
simplify(tmp_size, ns);
7777

7878
// special treatment for sizeof(T)*x
@@ -165,7 +165,7 @@ void goto_symext::symex_allocate(
165165
state.symbol_table.add(value_symbol);
166166

167167
// to allow constant propagation
168-
exprt zero_init = state.rename(code.op1(), ns);
168+
exprt zero_init = state.rename(code.op1(), ns).get();
169169
simplify(zero_init, ns);
170170

171171
INVARIANT(
@@ -234,7 +234,7 @@ void goto_symext::symex_gcc_builtin_va_arg_next(
234234
return; // ignore
235235

236236
// to allow constant propagation
237-
exprt tmp = state.rename(code.op0(), ns);
237+
exprt tmp = state.rename(code.op0(), ns).get();
238238
do_simplify(tmp);
239239
irep_idt id=get_symbol(tmp);
240240

@@ -311,7 +311,7 @@ void goto_symext::symex_printf(
311311
{
312312
PRECONDITION(!rhs.operands().empty());
313313

314-
exprt tmp_rhs = state.rename(rhs, ns);
314+
exprt tmp_rhs = state.rename(rhs, ns).get();
315315
do_simplify(tmp_rhs);
316316

317317
const exprt::operandst &operands=tmp_rhs.operands();
@@ -335,13 +335,13 @@ void goto_symext::symex_input(
335335
{
336336
PRECONDITION(code.operands().size() >= 2);
337337

338-
exprt id_arg = state.rename(code.op0(), ns);
338+
exprt id_arg = state.rename(code.op0(), ns).get();
339339

340340
std::list<exprt> args;
341341

342342
for(std::size_t i=1; i<code.operands().size(); i++)
343343
{
344-
exprt l2_arg = state.rename(code.operands()[i], ns);
344+
exprt l2_arg = state.rename(code.operands()[i], ns).get();
345345
do_simplify(l2_arg);
346346
args.emplace_back(std::move(l2_arg));
347347
}
@@ -356,15 +356,16 @@ void goto_symext::symex_output(
356356
const codet &code)
357357
{
358358
PRECONDITION(code.operands().size() >= 2);
359-
exprt id_arg = state.rename(code.op0(), ns);
359+
exprt id_arg = state.rename(code.op0(), ns).get();
360360

361-
std::list<exprt> args;
361+
std::list<renamedt<exprt, L2>> args;
362362

363363
for(std::size_t i=1; i<code.operands().size(); i++)
364364
{
365-
exprt l2_arg = state.rename(code.operands()[i], ns);
366-
do_simplify(l2_arg);
367-
args.emplace_back(std::move(l2_arg));
365+
renamedt<exprt, L2> l2_arg = state.rename(code.operands()[i], ns);
366+
if(symex_config.simplify_opt)
367+
l2_arg.simplify(ns);
368+
args.emplace_back(l2_arg);
368369
}
369370

370371
const irep_idt output_id=get_string_argument(id_arg, ns);
@@ -470,7 +471,7 @@ void goto_symext::symex_trace(
470471

471472
if(symex_config.debug_level >= debug_lvl)
472473
{
473-
std::list<exprt> vars;
474+
std::list<renamedt<exprt, L2>> vars;
474475

475476
irep_idt event = to_string_constant(code.arguments()[1].op0()).get_value();
476477

src/goto-symex/symex_dead.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void goto_symext::symex_dead(statet &state)
2121

2222
const code_deadt &code = instruction.get_dead();
2323

24-
ssa_exprt ssa = state.rename_ssa<L1>(ssa_exprt{code.symbol()}, ns);
24+
ssa_exprt ssa = state.rename_ssa<L1>(ssa_exprt{code.symbol()}, ns).get();
2525
const irep_idt &l1_identifier = ssa.get_identifier();
2626

2727
// we cannot remove the object from the L1 renaming map, because L1 renaming

src/goto-symex/symex_decl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
6161
else
6262
rhs=exprt(ID_invalid);
6363

64-
exprt l1_rhs = state.rename<L1>(std::move(rhs), ns);
64+
exprt l1_rhs = state.rename<L1>(std::move(rhs), ns).get();
6565
state.value_set.assign(ssa, l1_rhs, ns, true, false);
6666
}
6767

@@ -71,7 +71,7 @@ void goto_symext::symex_decl(statet &state, const symbol_exprt &expr)
7171

7272
const bool record_events=state.record_events;
7373
state.record_events=false;
74-
exprt expr_l2 = state.rename(std::move(ssa), ns);
74+
exprt expr_l2 = state.rename(std::move(ssa), ns).get();
7575
INVARIANT(
7676
expr_l2.id() == ID_symbol && expr_l2.get_bool(ID_C_SSA_symbol),
7777
"symbol to declare should not be replaced by constant propagation");

src/goto-symex/symex_dereference.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,13 +356,13 @@ void goto_symext::dereference(exprt &expr, statet &state)
356356
// from different frames. Would be enough to rename
357357
// symbols whose address is taken.
358358
PRECONDITION(!state.call_stack().empty());
359-
exprt l1_expr = state.rename<L1>(expr, ns);
359+
exprt l1_expr = state.rename<L1>(expr, ns).get();
360360

361361
// start the recursion!
362362
dereference_rec(l1_expr, state);
363363
// dereferencing may introduce new symbol_exprt
364364
// (like __CPROVER_memory)
365-
expr = state.rename<L1>(std::move(l1_expr), ns);
365+
expr = state.rename<L1>(std::move(l1_expr), ns).get();
366366

367367
// Dereferencing is likely to introduce new member-of-if constructs --
368368
// for example, "x->field" may have become "(x == &o1 ? o1 : o2).field."

src/goto-symex/symex_dereference_state.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
4949
symbolt sym=*symbol;
5050
symbolt *sym_ptr=nullptr;
5151
const ssa_exprt sym_expr =
52-
state.rename_ssa<L1>(ssa_exprt{sym.symbol_expr()}, ns);
52+
state.rename_ssa<L1>(ssa_exprt{sym.symbol_expr()}, ns).get();
5353
sym.name = sym_expr.get_identifier();
5454
state.symbol_table.move(sym, sym_ptr);
5555
return sym_ptr;
@@ -69,7 +69,7 @@ symex_dereference_statet::get_or_create_failed_symbol(const exprt &expr)
6969
symbolt sym=*symbol;
7070
symbolt *sym_ptr=nullptr;
7171
const ssa_exprt sym_expr =
72-
state.rename_ssa<L1>(ssa_exprt{sym.symbol_expr()}, ns);
72+
state.rename_ssa<L1>(ssa_exprt{sym.symbol_expr()}, ns).get();
7373
sym.name = sym_expr.get_identifier();
7474
state.symbol_table.move(sym, sym_ptr);
7575
return sym_ptr;

0 commit comments

Comments
 (0)