@@ -31,12 +31,14 @@ static void get_l1_name(exprt &expr);
31
31
32
32
goto_symex_statet::goto_symex_statet (
33
33
const symex_targett::sourcet &_source,
34
- guard_managert &manager)
34
+ guard_managert &manager,
35
+ std::function<std::size_t (const irep_idt &)> fresh_l2_name_provider)
35
36
: goto_statet(_source, manager),
36
37
guard_manager(manager),
37
38
symex_target(nullptr ),
38
39
record_events(true ),
39
- dirty()
40
+ dirty(),
41
+ fresh_l2_name_provider(fresh_l2_name_provider)
40
42
{
41
43
threads.emplace_back (guard_manager);
42
44
call_stack ().new_frame (source);
@@ -212,9 +214,7 @@ void goto_symex_statet::assignment(
212
214
#endif
213
215
214
216
// do the l2 renaming
215
- const auto level2_it =
216
- level2.current_names .emplace (l1_identifier, std::make_pair (lhs, 0 )).first ;
217
- symex_renaming_levelt::increase_counter (level2_it);
217
+ increase_generation (l1_identifier, lhs);
218
218
lhs = set_indices<L2>(std::move (lhs), ns).get ();
219
219
220
220
// in case we happen to be multi-threaded, record the memory access
@@ -439,10 +439,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
439
439
440
440
if (a_s_read.second .empty ())
441
441
{
442
- auto level2_it =
443
- level2.current_names .emplace (l1_identifier, std::make_pair (ssa_l1, 0 ))
444
- .first ;
445
- symex_renaming_levelt::increase_counter (level2_it);
442
+ increase_generation (l1_identifier, ssa_l1);
446
443
a_s_read.first =level2.current_count (l1_identifier);
447
444
}
448
445
const renamedt<ssa_exprt, L2> l2_false_case = set_indices<L2>(ssa_l1, ns);
@@ -476,10 +473,6 @@ bool goto_symex_statet::l2_thread_read_encoding(
476
473
return true ;
477
474
}
478
475
479
- const auto level2_it =
480
- level2.current_names .emplace (l1_identifier, std::make_pair (ssa_l1, 0 ))
481
- .first ;
482
-
483
476
// No event and no fresh index, but avoid constant propagation
484
477
if (!record_events)
485
478
{
@@ -488,7 +481,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
488
481
}
489
482
490
483
// produce a fresh L2 name
491
- symex_renaming_levelt::increase_counter (level2_it );
484
+ increase_generation (l1_identifier, ssa_l1 );
492
485
expr = set_indices<L2>(std::move (ssa_l1), ns).get ();
493
486
494
487
// and record that
@@ -499,6 +492,32 @@ bool goto_symex_statet::l2_thread_read_encoding(
499
492
return true ;
500
493
}
501
494
495
+ // / Allocates a fresh L2 name for the given L1 identifier, and makes it the
496
+ // / latest generation on this path.
497
+ void goto_symex_statet::increase_generation (
498
+ const irep_idt l1_identifier,
499
+ const ssa_exprt &lhs)
500
+ {
501
+ auto current_emplace_res =
502
+ level2.current_names .emplace (l1_identifier, std::make_pair (lhs, 0 ));
503
+
504
+ current_emplace_res.first ->second .second =
505
+ fresh_l2_name_provider (l1_identifier);
506
+ }
507
+
508
+ // / Allocates a fresh L2 name for the given L1 identifier, and makes it the
509
+ // / latest generation on this path. Does nothing if there isn't an expression
510
+ // / keyed by the l1 identifier.
511
+ void goto_symex_statet::increase_generation_if_exists (const irep_idt identifier)
512
+ {
513
+ // If we can't find the name in the local scope, this is a no-op.
514
+ auto current_names_iter = level2.current_names .find (identifier);
515
+ if (current_names_iter == level2.current_names .end ())
516
+ return ;
517
+
518
+ current_names_iter->second .second = fresh_l2_name_provider (identifier);
519
+ }
520
+
502
521
// / thread encoding
503
522
bool goto_symex_statet::l2_thread_write_encoding (
504
523
const ssa_exprt &expr,
0 commit comments