Skip to content

Commit d7c7434

Browse files
authored
Merge pull request #3434 from romainbrenguier/refactor/symex-state-levels
Move symex state levels to a new file
2 parents 58b9d93 + b265f7f commit d7c7434

11 files changed

+238
-237
lines changed

src/goto-instrument/accelerate/scratch_program.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ bool scratch_programt::check_sat(bool do_slice)
3535
output(ns, "scratch", std::cout);
3636
#endif
3737

38-
goto_symex_statet::propagationt::valuest constants;
39-
4038
symex.symex_with_state(symex_state, functions, symex_symbol_table);
4139

4240
if(do_slice)

src/goto-symex/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ SRC = auto_objects.cpp \
1010
path_storage.cpp \
1111
postcondition.cpp \
1212
precondition.cpp \
13+
renaming_level.cpp \
1314
show_program.cpp \
1415
show_vcc.cpp \
1516
slice.cpp \

src/goto-symex/goto_symex_state.cpp

Lines changed: 42 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -38,50 +38,6 @@ goto_symex_statet::goto_symex_statet()
3838

3939
goto_symex_statet::~goto_symex_statet()=default;
4040

41-
void goto_symex_statet::level0t::operator()(
42-
ssa_exprt &ssa_expr,
43-
const namespacet &ns,
44-
unsigned thread_nr)
45-
{
46-
// already renamed?
47-
if(!ssa_expr.get_level_0().empty())
48-
return;
49-
50-
const irep_idt &obj_identifier=ssa_expr.get_object_name();
51-
52-
// guards are not L0-renamed
53-
if(obj_identifier=="goto_symex::\\guard")
54-
return;
55-
56-
const symbolt *s;
57-
const bool found_l0 = !ns.lookup(obj_identifier, s);
58-
INVARIANT(found_l0, "level0: failed to find " + id2string(obj_identifier));
59-
60-
// don't rename shared variables or functions
61-
if(s->type.id()==ID_code ||
62-
s->is_shared())
63-
return;
64-
65-
// rename!
66-
ssa_expr.set_level_0(thread_nr);
67-
}
68-
69-
void goto_symex_statet::level1t::operator()(ssa_exprt &ssa_expr)
70-
{
71-
// already renamed?
72-
if(!ssa_expr.get_level_1().empty())
73-
return;
74-
75-
const irep_idt l0_name=ssa_expr.get_l1_object_identifier();
76-
77-
current_namest::const_iterator it=current_names.find(l0_name);
78-
if(it==current_names.end())
79-
return;
80-
81-
// rename!
82-
ssa_expr.set_level_1(it->second.second);
83-
}
84-
8541
/// write to a variable
8642
static bool check_renaming(const exprt &expr);
8743

@@ -255,7 +211,7 @@ void goto_symex_statet::assignment(
255211
if(level2.current_names.find(l1_identifier)==level2.current_names.end())
256212
level2.current_names[l1_identifier]=std::make_pair(lhs, 0);
257213
level2.increase_counter(l1_identifier);
258-
set_ssa_indices(lhs, ns, L2);
214+
set_l2_indices(lhs, ns);
259215

260216
// in case we happen to be multi-threaded, record the memory access
261217
bool is_shared=l2_thread_write_encoding(lhs, ns);
@@ -271,9 +227,9 @@ void goto_symex_statet::assignment(
271227
// for value propagation -- the RHS is L2
272228

273229
if(!is_shared && record_value && goto_symex_is_constantt()(rhs))
274-
propagation.values[l1_identifier]=rhs;
230+
propagation[l1_identifier] = rhs;
275231
else
276-
propagation.remove(l1_identifier);
232+
propagation.erase(l1_identifier);
277233

278234
{
279235
// update value sets
@@ -297,58 +253,34 @@ void goto_symex_statet::assignment(
297253
#endif
298254
}
299255

300-
void goto_symex_statet::propagationt::operator()(exprt &expr)
256+
void goto_symex_statet::set_l0_indices(
257+
ssa_exprt &ssa_expr,
258+
const namespacet &ns)
301259
{
302-
if(expr.id()==ID_symbol)
303-
{
304-
valuest::const_iterator it =
305-
values.find(to_symbol_expr(expr).get_identifier());
306-
if(it!=values.end())
307-
expr=it->second;
308-
}
309-
else if(expr.id()==ID_address_of)
310-
{
311-
// ignore
312-
}
313-
else
314-
{
315-
// do this recursively
316-
Forall_operands(it, expr)
317-
operator()(*it);
318-
}
260+
level0(ssa_expr, ns, source.thread_nr);
319261
}
320262

321-
void goto_symex_statet::set_ssa_indices(
263+
void goto_symex_statet::set_l1_indices(
322264
ssa_exprt &ssa_expr,
323-
const namespacet &ns,
324-
levelt level)
265+
const namespacet &ns)
325266
{
326-
switch(level)
327-
{
328-
case L0:
329-
level0(ssa_expr, ns, source.thread_nr);
330-
break;
331-
332-
case L1:
333-
if(!ssa_expr.get_level_2().empty())
334-
return;
335-
if(!ssa_expr.get_level_1().empty())
336-
return;
337-
level0(ssa_expr, ns, source.thread_nr);
338-
level1(ssa_expr);
339-
break;
340-
341-
case L2:
342-
if(!ssa_expr.get_level_2().empty())
343-
return;
344-
level0(ssa_expr, ns, source.thread_nr);
345-
level1(ssa_expr);
346-
ssa_expr.set_level_2(level2.current_count(ssa_expr.get_identifier()));
347-
break;
267+
if(!ssa_expr.get_level_2().empty())
268+
return;
269+
if(!ssa_expr.get_level_1().empty())
270+
return;
271+
level0(ssa_expr, ns, source.thread_nr);
272+
level1(ssa_expr);
273+
}
348274

349-
default:
350-
UNREACHABLE;
351-
}
275+
void goto_symex_statet::set_l2_indices(
276+
ssa_exprt &ssa_expr,
277+
const namespacet &ns)
278+
{
279+
if(!ssa_expr.get_level_2().empty())
280+
return;
281+
level0(ssa_expr, ns, source.thread_nr);
282+
level1(ssa_expr);
283+
ssa_expr.set_level_2(level2.current_count(ssa_expr.get_identifier()));
352284
}
353285

354286
void goto_symex_statet::rename(
@@ -363,15 +295,21 @@ void goto_symex_statet::rename(
363295
{
364296
ssa_exprt &ssa=to_ssa_expr(expr);
365297

366-
if(level==L0 || level==L1)
298+
if(level == L0)
299+
{
300+
set_l0_indices(ssa, ns);
301+
rename(expr.type(), ssa.get_identifier(), ns, level);
302+
ssa.update_type();
303+
}
304+
else if(level == L1)
367305
{
368-
set_ssa_indices(ssa, ns, level);
306+
set_l1_indices(ssa, ns);
369307
rename(expr.type(), ssa.get_identifier(), ns, level);
370308
ssa.update_type();
371309
}
372310
else if(level==L2)
373311
{
374-
set_ssa_indices(ssa, ns, L1);
312+
set_l1_indices(ssa, ns);
375313
rename(expr.type(), ssa.get_identifier(), ns, level);
376314
ssa.update_type();
377315

@@ -387,13 +325,12 @@ void goto_symex_statet::rename(
387325
{
388326
// We also consider propagation if we go up to L2.
389327
// L1 identifiers are used for propagation!
390-
propagationt::valuest::const_iterator p_it=
391-
propagation.values.find(ssa.get_identifier());
328+
auto p_it = propagation.find(ssa.get_identifier());
392329

393-
if(p_it!=propagation.values.end())
330+
if(p_it != propagation.end())
394331
expr=p_it->second; // already L2
395332
else
396-
set_ssa_indices(ssa, ns, L2);
333+
set_l2_indices(ssa, ns);
397334
}
398335
}
399336
}
@@ -519,7 +456,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
519456
cond=or_exprt(no_write.op(), cond);
520457

521458
if_exprt tmp(cond, ssa_l1, ssa_l1);
522-
set_ssa_indices(to_ssa_expr(tmp.true_case()), ns, L2);
459+
set_l2_indices(to_ssa_expr(tmp.true_case()), ns);
523460

524461
if(a_s_read.second.empty())
525462
{
@@ -551,7 +488,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
551488
source,
552489
symex_targett::assignment_typet::PHI);
553490

554-
set_ssa_indices(ssa_l1, ns, L2);
491+
set_l2_indices(ssa_l1, ns);
555492
expr=ssa_l1;
556493

557494
a_s_read.second.push_back(guard);
@@ -567,14 +504,14 @@ bool goto_symex_statet::l2_thread_read_encoding(
567504
// No event and no fresh index, but avoid constant propagation
568505
if(!record_events)
569506
{
570-
set_ssa_indices(ssa_l1, ns, L2);
507+
set_l2_indices(ssa_l1, ns);
571508
expr=ssa_l1;
572509
return true;
573510
}
574511

575512
// produce a fresh L2 name
576513
level2.increase_counter(l1_identifier);
577-
set_ssa_indices(ssa_l1, ns, L2);
514+
set_l2_indices(ssa_l1, ns);
578515
expr=ssa_l1;
579516

580517
// and record that
@@ -636,7 +573,7 @@ void goto_symex_statet::rename_address(
636573
ssa_exprt &ssa=to_ssa_expr(expr);
637574

638575
// only do L1!
639-
set_ssa_indices(ssa, ns, L1);
576+
set_l1_indices(ssa, ns);
640577

641578
rename(expr.type(), ssa.get_identifier(), ns, level);
642579
ssa.update_type();

0 commit comments

Comments
 (0)