Skip to content

Commit 611b910

Browse files
Merge pull request #4333 from romainbrenguier/refactor/symex-set-indices-template
Make set_indices a template
2 parents 00f125f + 78cf428 commit 611b910

File tree

2 files changed

+34
-42
lines changed

2 files changed

+34
-42
lines changed

src/goto-symex/goto_symex_state.cpp

+31-34
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,27 @@ class goto_symex_is_constantt : public is_constantt
156156
}
157157
};
158158

159+
template <>
160+
renamedt<ssa_exprt, L0>
161+
goto_symex_statet::set_indices<L0>(ssa_exprt ssa_expr, const namespacet &ns)
162+
{
163+
return level0(std::move(ssa_expr), ns, source.thread_nr);
164+
}
165+
166+
template <>
167+
renamedt<ssa_exprt, L1>
168+
goto_symex_statet::set_indices<L1>(ssa_exprt ssa_expr, const namespacet &ns)
169+
{
170+
return level1(level0(std::move(ssa_expr), ns, source.thread_nr));
171+
}
172+
173+
template <>
174+
renamedt<ssa_exprt, L2>
175+
goto_symex_statet::set_indices<L2>(ssa_exprt ssa_expr, const namespacet &ns)
176+
{
177+
return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
178+
}
179+
159180
void goto_symex_statet::assignment(
160181
ssa_exprt &lhs, // L0/L1
161182
const exprt &rhs, // L2
@@ -188,7 +209,7 @@ void goto_symex_statet::assignment(
188209
const auto level2_it =
189210
level2.current_names.emplace(l1_identifier, std::make_pair(lhs, 0)).first;
190211
symex_renaming_levelt::increase_counter(level2_it);
191-
lhs = set_l2_indices(std::move(lhs), ns).get();
212+
lhs = set_indices<L2>(std::move(lhs), ns).get();
192213

193214
// in case we happen to be multi-threaded, record the memory access
194215
bool is_shared=l2_thread_write_encoding(lhs, ns);
@@ -235,37 +256,13 @@ void goto_symex_statet::assignment(
235256
#endif
236257
}
237258

238-
renamedt<ssa_exprt, L0>
239-
goto_symex_statet::set_l0_indices(ssa_exprt ssa_expr, const namespacet &ns)
240-
{
241-
return level0(std::move(ssa_expr), ns, source.thread_nr);
242-
}
243-
244-
renamedt<ssa_exprt, L1>
245-
goto_symex_statet::set_l1_indices(ssa_exprt ssa_expr, const namespacet &ns)
246-
{
247-
return level1(level0(std::move(ssa_expr), ns, source.thread_nr));
248-
}
249-
250-
renamedt<ssa_exprt, L2>
251-
goto_symex_statet::set_l2_indices(ssa_exprt ssa_expr, const namespacet &ns)
252-
{
253-
return level2(level1(level0(std::move(ssa_expr), ns, source.thread_nr)));
254-
}
255-
256259
template <levelt level>
257260
ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
258261
{
259262
static_assert(
260263
level == L0 || level == L1,
261264
"rename_ssa can only be used for levels L0 and L1");
262-
if(level == L0)
263-
ssa = set_l0_indices(std::move(ssa), ns).get();
264-
else if(level == L1)
265-
ssa = set_l1_indices(std::move(ssa), ns).get();
266-
else
267-
UNREACHABLE;
268-
265+
ssa = set_indices<level>(std::move(ssa), ns).get();
269266
rename<level>(ssa.type(), ssa.get_identifier(), ns);
270267
ssa.update_type();
271268
return ssa;
@@ -297,7 +294,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
297294
}
298295
else if(level==L2)
299296
{
300-
ssa = set_l1_indices(std::move(ssa), ns).get();
297+
ssa = set_indices<L1>(std::move(ssa), ns).get();
301298
rename<level>(expr.type(), ssa.get_identifier(), ns);
302299
ssa.update_type();
303300

@@ -318,7 +315,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
318315
if(p_it != propagation.end())
319316
expr=p_it->second; // already L2
320317
else
321-
ssa = set_l2_indices(std::move(ssa), ns).get();
318+
ssa = set_indices<L2>(std::move(ssa), ns).get();
322319
}
323320
}
324321
}
@@ -432,7 +429,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
432429
if(!no_write.op().is_false())
433430
cond |= guardt{no_write.op()};
434431

435-
const renamedt<ssa_exprt, L2> l2_true_case = set_l2_indices(ssa_l1, ns);
432+
const renamedt<ssa_exprt, L2> l2_true_case = set_indices<L2>(ssa_l1, ns);
436433

437434
if(a_s_read.second.empty())
438435
{
@@ -442,7 +439,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
442439
symex_renaming_levelt::increase_counter(level2_it);
443440
a_s_read.first=level2.current_count(l1_identifier);
444441
}
445-
const renamedt<ssa_exprt, L2> l2_false_case = set_l2_indices(ssa_l1, ns);
442+
const renamedt<ssa_exprt, L2> l2_false_case = set_indices<L2>(ssa_l1, ns);
446443

447444
exprt tmp;
448445
if(cond.is_false())
@@ -464,7 +461,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
464461
source,
465462
symex_targett::assignment_typet::PHI);
466463

467-
expr = set_l2_indices(std::move(ssa_l1), ns).get();
464+
expr = set_indices<L2>(std::move(ssa_l1), ns).get();
468465

469466
a_s_read.second.push_back(guard);
470467
if(!no_write.op().is_false())
@@ -480,13 +477,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
480477
// No event and no fresh index, but avoid constant propagation
481478
if(!record_events)
482479
{
483-
expr = set_l2_indices(std::move(ssa_l1), ns).get();
480+
expr = set_indices<L2>(std::move(ssa_l1), ns).get();
484481
return true;
485482
}
486483

487484
// produce a fresh L2 name
488485
symex_renaming_levelt::increase_counter(level2_it);
489-
expr = set_l2_indices(std::move(ssa_l1), ns).get();
486+
expr = set_indices<L2>(std::move(ssa_l1), ns).get();
490487

491488
// and record that
492489
INVARIANT_STRUCTURED(
@@ -543,7 +540,7 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
543540
ssa_exprt &ssa=to_ssa_expr(expr);
544541

545542
// only do L1!
546-
ssa = set_l1_indices(std::move(ssa), ns).get();
543+
ssa = set_indices<L1>(std::move(ssa), ns).get();
547544

548545
rename<level>(expr.type(), ssa.get_identifier(), ns);
549546
ssa.update_type();

src/goto-symex/goto_symex_state.h

+3-8
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,9 @@ class goto_symex_statet final : public goto_statet
113113
template <levelt>
114114
void rename_address(exprt &expr, const namespacet &ns);
115115

116-
/// Update level 0 values.
117-
renamedt<ssa_exprt, L0> set_l0_indices(ssa_exprt expr, const namespacet &ns);
118-
119-
/// Update level 0 and 1 values.
120-
renamedt<ssa_exprt, L1> set_l1_indices(ssa_exprt expr, const namespacet &ns);
121-
122-
/// Update level 0, 1 and 2 values.
123-
renamedt<ssa_exprt, L2> set_l2_indices(ssa_exprt expr, const namespacet &ns);
116+
/// Update values up to \c level.
117+
template <levelt level>
118+
renamedt<ssa_exprt, level> set_indices(ssa_exprt expr, const namespacet &ns);
124119

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

0 commit comments

Comments
 (0)