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