Skip to content

Commit 00f125f

Browse files
Merge pull request #3986 from romainbrenguier/refactor/symex-rename
Make return type of set_l*_indices be a renamedt [blocks: #4333]
2 parents b9b6dac + 1bb05b6 commit 00f125f

File tree

3 files changed

+34
-48
lines changed

3 files changed

+34
-48
lines changed

src/goto-symex/goto_symex_state.cpp

+24-44
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);
@@ -235,37 +235,22 @@ void goto_symex_statet::assignment(
235235
#endif
236236
}
237237

238-
void goto_symex_statet::set_l0_indices(
239-
ssa_exprt &ssa_expr,
240-
const namespacet &ns)
238+
renamedt<ssa_exprt, L0>
239+
goto_symex_statet::set_l0_indices(ssa_exprt ssa_expr, const namespacet &ns)
241240
{
242-
renamedt<ssa_exprt, L0> renamed =
243-
level0(std::move(ssa_expr), ns, source.thread_nr);
244-
ssa_expr = renamed.get();
241+
return level0(std::move(ssa_expr), ns, source.thread_nr);
245242
}
246243

247-
void goto_symex_statet::set_l1_indices(
248-
ssa_exprt &ssa_expr,
249-
const namespacet &ns)
244+
renamedt<ssa_exprt, L1>
245+
goto_symex_statet::set_l1_indices(ssa_exprt ssa_expr, const namespacet &ns)
250246
{
251-
if(!ssa_expr.get_level_2().empty())
252-
return;
253-
if(!ssa_expr.get_level_1().empty())
254-
return;
255-
renamedt<ssa_exprt, L1> l1 =
256-
level1(level0(std::move(ssa_expr), ns, source.thread_nr));
257-
ssa_expr = l1.get();
247+
return level1(level0(std::move(ssa_expr), ns, source.thread_nr));
258248
}
259249

260-
void goto_symex_statet::set_l2_indices(
261-
ssa_exprt &ssa_expr,
262-
const namespacet &ns)
250+
renamedt<ssa_exprt, L2>
251+
goto_symex_statet::set_l2_indices(ssa_exprt ssa_expr, const namespacet &ns)
263252
{
264-
if(!ssa_expr.get_level_2().empty())
265-
return;
266-
renamedt<ssa_exprt, L2> l2 =
267-
level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
268-
ssa_expr = l2.get();
253+
return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
269254
}
270255

271256
template <levelt level>
@@ -275,9 +260,9 @@ ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
275260
level == L0 || level == L1,
276261
"rename_ssa can only be used for levels L0 and L1");
277262
if(level == L0)
278-
set_l0_indices(ssa, ns);
263+
ssa = set_l0_indices(std::move(ssa), ns).get();
279264
else if(level == L1)
280-
set_l1_indices(ssa, ns);
265+
ssa = set_l1_indices(std::move(ssa), ns).get();
281266
else
282267
UNREACHABLE;
283268

@@ -312,7 +297,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
312297
}
313298
else if(level==L2)
314299
{
315-
set_l1_indices(ssa, ns);
300+
ssa = set_l1_indices(std::move(ssa), ns).get();
316301
rename<level>(expr.type(), ssa.get_identifier(), ns);
317302
ssa.update_type();
318303

@@ -333,7 +318,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
333318
if(p_it != propagation.end())
334319
expr=p_it->second; // already L2
335320
else
336-
set_l2_indices(ssa, ns);
321+
ssa = set_l2_indices(std::move(ssa), ns).get();
337322
}
338323
}
339324
}
@@ -447,8 +432,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
447432
if(!no_write.op().is_false())
448433
cond |= guardt{no_write.op()};
449434

450-
if_exprt tmp(cond.as_expr(), ssa_l1, ssa_l1);
451-
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);
452436

453437
if(a_s_read.second.empty())
454438
{
@@ -458,14 +442,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
458442
symex_renaming_levelt::increase_counter(level2_it);
459443
a_s_read.first=level2.current_count(l1_identifier);
460444
}
445+
const renamedt<ssa_exprt, L2> l2_false_case = set_l2_indices(ssa_l1, ns);
461446

462-
to_ssa_expr(tmp.false_case()).set_level_2(a_s_read.first);
463-
447+
exprt tmp;
464448
if(cond.is_false())
465-
{
466-
exprt t=tmp.false_case();
467-
t.swap(tmp);
468-
}
449+
tmp = l2_false_case.get();
450+
else
451+
tmp = if_exprt{cond.as_expr(), l2_true_case.get(), l2_false_case.get()};
469452

470453
const bool record_events_bak=record_events;
471454
record_events=false;
@@ -481,8 +464,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
481464
source,
482465
symex_targett::assignment_typet::PHI);
483466

484-
set_l2_indices(ssa_l1, ns);
485-
expr=ssa_l1;
467+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
486468

487469
a_s_read.second.push_back(guard);
488470
if(!no_write.op().is_false())
@@ -498,15 +480,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
498480
// No event and no fresh index, but avoid constant propagation
499481
if(!record_events)
500482
{
501-
set_l2_indices(ssa_l1, ns);
502-
expr=ssa_l1;
483+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
503484
return true;
504485
}
505486

506487
// produce a fresh L2 name
507488
symex_renaming_levelt::increase_counter(level2_it);
508-
set_l2_indices(ssa_l1, ns);
509-
expr=ssa_l1;
489+
expr = set_l2_indices(std::move(ssa_l1), ns).get();
510490

511491
// and record that
512492
INVARIANT_STRUCTURED(
@@ -563,7 +543,7 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
563543
ssa_exprt &ssa=to_ssa_expr(expr);
564544

565545
// only do L1!
566-
set_l1_indices(ssa, ns);
546+
ssa = set_l1_indices(std::move(ssa), ns).get();
567547

568548
rename<level>(expr.type(), ssa.get_identifier(), ns);
569549
ssa.update_type();

src/goto-symex/goto_symex_state.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@ class goto_symex_statet final : public goto_statet
114114
void rename_address(exprt &expr, const namespacet &ns);
115115

116116
/// Update level 0 values.
117-
void set_l0_indices(ssa_exprt &expr, const namespacet &ns);
117+
renamedt<ssa_exprt, L0> set_l0_indices(ssa_exprt expr, const namespacet &ns);
118118

119119
/// Update level 0 and 1 values.
120-
void set_l1_indices(ssa_exprt &expr, const namespacet &ns);
120+
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

+7-1
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ operator()(ssa_exprt ssa_expr, const namespacet &ns, unsigned thread_nr) const
4646
renamedt<ssa_exprt, L1> symex_level1t::
4747
operator()(renamedt<ssa_exprt, L0> l0_expr) const
4848
{
49-
if(!l0_expr.get().get_level_1().empty())
49+
if(
50+
!l0_expr.get().get_level_1().empty() ||
51+
!l0_expr.get().get_level_2().empty())
52+
{
5053
return renamedt<ssa_exprt, L1>{std::move(l0_expr.value)};
54+
}
5155

5256
const irep_idt l0_name = l0_expr.get().get_l1_object_identifier();
5357

@@ -63,6 +67,8 @@ operator()(renamedt<ssa_exprt, L0> l0_expr) const
6367
renamedt<ssa_exprt, L2> symex_level2t::
6468
operator()(renamedt<ssa_exprt, L1> l1_expr) const
6569
{
70+
if(!l1_expr.get().get_level_2().empty())
71+
return renamedt<ssa_exprt, L2>{std::move(l1_expr.value)};
6672
l1_expr.value.set_level_2(current_count(l1_expr.get().get_identifier()));
6773
return renamedt<ssa_exprt, L2>{std::move(l1_expr.value)};
6874
}

0 commit comments

Comments
 (0)