@@ -156,6 +156,27 @@ class goto_symex_is_constantt : public is_constantt
156
156
}
157
157
};
158
158
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
+
159
180
void goto_symex_statet::assignment (
160
181
ssa_exprt &lhs, // L0/L1
161
182
const exprt &rhs, // L2
@@ -188,7 +209,7 @@ void goto_symex_statet::assignment(
188
209
const auto level2_it =
189
210
level2.current_names .emplace (l1_identifier, std::make_pair (lhs, 0 )).first ;
190
211
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 ();
192
213
193
214
// in case we happen to be multi-threaded, record the memory access
194
215
bool is_shared=l2_thread_write_encoding (lhs, ns);
@@ -235,37 +256,13 @@ void goto_symex_statet::assignment(
235
256
#endif
236
257
}
237
258
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
-
256
259
template <levelt level>
257
260
ssa_exprt goto_symex_statet::rename_ssa (ssa_exprt ssa, const namespacet &ns)
258
261
{
259
262
static_assert (
260
263
level == L0 || level == L1,
261
264
" 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 ();
269
266
rename <level>(ssa.type (), ssa.get_identifier (), ns);
270
267
ssa.update_type ();
271
268
return ssa;
@@ -297,7 +294,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
297
294
}
298
295
else if (level==L2)
299
296
{
300
- ssa = set_l1_indices (std::move (ssa), ns).get ();
297
+ ssa = set_indices<L1> (std::move (ssa), ns).get ();
301
298
rename <level>(expr.type (), ssa.get_identifier (), ns);
302
299
ssa.update_type ();
303
300
@@ -318,7 +315,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
318
315
if (p_it != propagation.end ())
319
316
expr=p_it->second ; // already L2
320
317
else
321
- ssa = set_l2_indices (std::move (ssa), ns).get ();
318
+ ssa = set_indices<L2> (std::move (ssa), ns).get ();
322
319
}
323
320
}
324
321
}
@@ -432,7 +429,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
432
429
if (!no_write.op ().is_false ())
433
430
cond |= guardt{no_write.op ()};
434
431
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);
436
433
437
434
if (a_s_read.second .empty ())
438
435
{
@@ -442,7 +439,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
442
439
symex_renaming_levelt::increase_counter (level2_it);
443
440
a_s_read.first =level2.current_count (l1_identifier);
444
441
}
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);
446
443
447
444
exprt tmp;
448
445
if (cond.is_false ())
@@ -464,7 +461,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
464
461
source,
465
462
symex_targett::assignment_typet::PHI);
466
463
467
- expr = set_l2_indices (std::move (ssa_l1), ns).get ();
464
+ expr = set_indices<L2> (std::move (ssa_l1), ns).get ();
468
465
469
466
a_s_read.second .push_back (guard);
470
467
if (!no_write.op ().is_false ())
@@ -480,13 +477,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
480
477
// No event and no fresh index, but avoid constant propagation
481
478
if (!record_events)
482
479
{
483
- expr = set_l2_indices (std::move (ssa_l1), ns).get ();
480
+ expr = set_indices<L2> (std::move (ssa_l1), ns).get ();
484
481
return true ;
485
482
}
486
483
487
484
// produce a fresh L2 name
488
485
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 ();
490
487
491
488
// and record that
492
489
INVARIANT_STRUCTURED (
@@ -543,7 +540,7 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
543
540
ssa_exprt &ssa=to_ssa_expr (expr);
544
541
545
542
// only do L1!
546
- ssa = set_l1_indices (std::move (ssa), ns).get ();
543
+ ssa = set_indices<L1> (std::move (ssa), ns).get ();
547
544
548
545
rename <level>(expr.type (), ssa.get_identifier (), ns);
549
546
ssa.update_type ();
0 commit comments