Skip to content

Commit 1bb05b6

Browse files
Make set_l2_indices return a renamedt
This captures the information of which renaming the expression has been through. This requires making symex_level2t::operator() handle non-empty L2. This was handled by set_l2_indices, but it is neccessary to handle it in symex_level2t for making set_l2_indices return a renamedt.
1 parent 2265305 commit 1bb05b6

File tree

3 files changed

+17
-25
lines changed

3 files changed

+17
-25
lines changed

src/goto-symex/goto_symex_state.cpp

+14-24
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void goto_symex_statet::assignment(
188188
const auto level2_it =
189189
level2.current_names.emplace(l1_identifier, std::make_pair(lhs, 0)).first;
190190
symex_renaming_levelt::increase_counter(level2_it);
191-
set_l2_indices(lhs, ns);
191+
lhs = set_l2_indices(std::move(lhs), ns).get();
192192

193193
// in case we happen to be multi-threaded, record the memory access
194194
bool is_shared=l2_thread_write_encoding(lhs, ns);
@@ -247,15 +247,10 @@ goto_symex_statet::set_l1_indices(ssa_exprt ssa_expr, const namespacet &ns)
247247
return level1(level0(std::move(ssa_expr), ns, source.thread_nr));
248248
}
249249

250-
void goto_symex_statet::set_l2_indices(
251-
ssa_exprt &ssa_expr,
252-
const namespacet &ns)
250+
renamedt<ssa_exprt, L2>
251+
goto_symex_statet::set_l2_indices(ssa_exprt ssa_expr, const namespacet &ns)
253252
{
254-
if(!ssa_expr.get_level_2().empty())
255-
return;
256-
renamedt<ssa_exprt, L2> l2 =
257-
level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
258-
ssa_expr = l2.get();
253+
return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
259254
}
260255

261256
template <levelt level>
@@ -323,7 +318,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
323318
if(p_it != propagation.end())
324319
expr=p_it->second; // already L2
325320
else
326-
set_l2_indices(ssa, ns);
321+
ssa = set_l2_indices(std::move(ssa), ns).get();
327322
}
328323
}
329324
}
@@ -437,8 +432,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
437432
if(!no_write.op().is_false())
438433
cond |= guardt{no_write.op()};
439434

440-
if_exprt tmp(cond.as_expr(), ssa_l1, ssa_l1);
441-
set_l2_indices(to_ssa_expr(tmp.true_case()), ns);
435+
const renamedt<ssa_exprt, L2> l2_true_case = set_l2_indices(ssa_l1, ns);
442436

443437
if(a_s_read.second.empty())
444438
{
@@ -448,14 +442,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
448442
symex_renaming_levelt::increase_counter(level2_it);
449443
a_s_read.first=level2.current_count(l1_identifier);
450444
}
445+
const renamedt<ssa_exprt, L2> l2_false_case = set_l2_indices(ssa_l1, ns);
451446

452-
to_ssa_expr(tmp.false_case()).set_level_2(a_s_read.first);
453-
447+
exprt tmp;
454448
if(cond.is_false())
455-
{
456-
exprt t=tmp.false_case();
457-
t.swap(tmp);
458-
}
449+
tmp = l2_false_case.get();
450+
else
451+
tmp = if_exprt{cond.as_expr(), l2_true_case.get(), l2_false_case.get()};
459452

460453
const bool record_events_bak=record_events;
461454
record_events=false;
@@ -471,8 +464,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
471464
source,
472465
symex_targett::assignment_typet::PHI);
473466

474-
set_l2_indices(ssa_l1, ns);
475-
expr=ssa_l1;
467+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
476468

477469
a_s_read.second.push_back(guard);
478470
if(!no_write.op().is_false())
@@ -488,15 +480,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
488480
// No event and no fresh index, but avoid constant propagation
489481
if(!record_events)
490482
{
491-
set_l2_indices(ssa_l1, ns);
492-
expr=ssa_l1;
483+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
493484
return true;
494485
}
495486

496487
// produce a fresh L2 name
497488
symex_renaming_levelt::increase_counter(level2_it);
498-
set_l2_indices(ssa_l1, ns);
499-
expr=ssa_l1;
489+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
500490

501491
// and record that
502492
INVARIANT_STRUCTURED(

src/goto-symex/goto_symex_state.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class goto_symex_statet final : public goto_statet
120120
renamedt<ssa_exprt, L1> set_l1_indices(ssa_exprt expr, const namespacet &ns);
121121

122122
/// Update level 0, 1 and 2 values.
123-
void set_l2_indices(ssa_exprt &expr, const namespacet &ns);
123+
renamedt<ssa_exprt, L2> set_l2_indices(ssa_exprt expr, const namespacet &ns);
124124

125125
// this maps L1 names to (L2) types
126126
typedef std::unordered_map<irep_idt, typet> l1_typest;

src/goto-symex/renaming_level.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ operator()(renamedt<ssa_exprt, L0> l0_expr) const
6767
renamedt<ssa_exprt, L2> symex_level2t::
6868
operator()(renamedt<ssa_exprt, L1> l1_expr) const
6969
{
70+
if(!l1_expr.get().get_level_2().empty())
71+
return renamedt<ssa_exprt, L2>{std::move(l1_expr.value)};
7072
l1_expr.value.set_level_2(current_count(l1_expr.get().get_identifier()));
7173
return renamedt<ssa_exprt, L2>{std::move(l1_expr.value)};
7274
}

0 commit comments

Comments
 (0)