@@ -38,50 +38,6 @@ goto_symex_statet::goto_symex_statet()
38
38
39
39
goto_symex_statet::~goto_symex_statet ()=default ;
40
40
41
- void goto_symex_statet::level0t::operator ()(
42
- ssa_exprt &ssa_expr,
43
- const namespacet &ns,
44
- unsigned thread_nr)
45
- {
46
- // already renamed?
47
- if (!ssa_expr.get_level_0 ().empty ())
48
- return ;
49
-
50
- const irep_idt &obj_identifier=ssa_expr.get_object_name ();
51
-
52
- // guards are not L0-renamed
53
- if (obj_identifier==" goto_symex::\\ guard" )
54
- return ;
55
-
56
- const symbolt *s;
57
- const bool found_l0 = !ns.lookup (obj_identifier, s);
58
- INVARIANT (found_l0, " level0: failed to find " + id2string (obj_identifier));
59
-
60
- // don't rename shared variables or functions
61
- if (s->type .id ()==ID_code ||
62
- s->is_shared ())
63
- return ;
64
-
65
- // rename!
66
- ssa_expr.set_level_0 (thread_nr);
67
- }
68
-
69
- void goto_symex_statet::level1t::operator ()(ssa_exprt &ssa_expr)
70
- {
71
- // already renamed?
72
- if (!ssa_expr.get_level_1 ().empty ())
73
- return ;
74
-
75
- const irep_idt l0_name=ssa_expr.get_l1_object_identifier ();
76
-
77
- current_namest::const_iterator it=current_names.find (l0_name);
78
- if (it==current_names.end ())
79
- return ;
80
-
81
- // rename!
82
- ssa_expr.set_level_1 (it->second .second );
83
- }
84
-
85
41
// / write to a variable
86
42
static bool check_renaming (const exprt &expr);
87
43
@@ -255,7 +211,7 @@ void goto_symex_statet::assignment(
255
211
if (level2.current_names .find (l1_identifier)==level2.current_names .end ())
256
212
level2.current_names [l1_identifier]=std::make_pair (lhs, 0 );
257
213
level2.increase_counter (l1_identifier);
258
- set_ssa_indices (lhs, ns, L2 );
214
+ set_l2_indices (lhs, ns);
259
215
260
216
// in case we happen to be multi-threaded, record the memory access
261
217
bool is_shared=l2_thread_write_encoding (lhs, ns);
@@ -271,9 +227,9 @@ void goto_symex_statet::assignment(
271
227
// for value propagation -- the RHS is L2
272
228
273
229
if (!is_shared && record_value && goto_symex_is_constantt ()(rhs))
274
- propagation. values [l1_identifier]= rhs;
230
+ propagation[l1_identifier] = rhs;
275
231
else
276
- propagation.remove (l1_identifier);
232
+ propagation.erase (l1_identifier);
277
233
278
234
{
279
235
// update value sets
@@ -297,58 +253,34 @@ void goto_symex_statet::assignment(
297
253
#endif
298
254
}
299
255
300
- void goto_symex_statet::propagationt::operator ()(exprt &expr)
256
+ void goto_symex_statet::set_l0_indices (
257
+ ssa_exprt &ssa_expr,
258
+ const namespacet &ns)
301
259
{
302
- if (expr.id ()==ID_symbol)
303
- {
304
- valuest::const_iterator it =
305
- values.find (to_symbol_expr (expr).get_identifier ());
306
- if (it!=values.end ())
307
- expr=it->second ;
308
- }
309
- else if (expr.id ()==ID_address_of)
310
- {
311
- // ignore
312
- }
313
- else
314
- {
315
- // do this recursively
316
- Forall_operands (it, expr)
317
- operator ()(*it);
318
- }
260
+ level0 (ssa_expr, ns, source.thread_nr );
319
261
}
320
262
321
- void goto_symex_statet::set_ssa_indices (
263
+ void goto_symex_statet::set_l1_indices (
322
264
ssa_exprt &ssa_expr,
323
- const namespacet &ns,
324
- levelt level)
265
+ const namespacet &ns)
325
266
{
326
- switch (level)
327
- {
328
- case L0:
329
- level0 (ssa_expr, ns, source.thread_nr );
330
- break ;
331
-
332
- case L1:
333
- if (!ssa_expr.get_level_2 ().empty ())
334
- return ;
335
- if (!ssa_expr.get_level_1 ().empty ())
336
- return ;
337
- level0 (ssa_expr, ns, source.thread_nr );
338
- level1 (ssa_expr);
339
- break ;
340
-
341
- case L2:
342
- if (!ssa_expr.get_level_2 ().empty ())
343
- return ;
344
- level0 (ssa_expr, ns, source.thread_nr );
345
- level1 (ssa_expr);
346
- ssa_expr.set_level_2 (level2.current_count (ssa_expr.get_identifier ()));
347
- break ;
267
+ if (!ssa_expr.get_level_2 ().empty ())
268
+ return ;
269
+ if (!ssa_expr.get_level_1 ().empty ())
270
+ return ;
271
+ level0 (ssa_expr, ns, source.thread_nr );
272
+ level1 (ssa_expr);
273
+ }
348
274
349
- default :
350
- UNREACHABLE;
351
- }
275
+ void goto_symex_statet::set_l2_indices (
276
+ ssa_exprt &ssa_expr,
277
+ const namespacet &ns)
278
+ {
279
+ if (!ssa_expr.get_level_2 ().empty ())
280
+ return ;
281
+ level0 (ssa_expr, ns, source.thread_nr );
282
+ level1 (ssa_expr);
283
+ ssa_expr.set_level_2 (level2.current_count (ssa_expr.get_identifier ()));
352
284
}
353
285
354
286
void goto_symex_statet::rename (
@@ -363,15 +295,21 @@ void goto_symex_statet::rename(
363
295
{
364
296
ssa_exprt &ssa=to_ssa_expr (expr);
365
297
366
- if (level==L0 || level==L1)
298
+ if (level == L0)
299
+ {
300
+ set_l0_indices (ssa, ns);
301
+ rename (expr.type (), ssa.get_identifier (), ns, level);
302
+ ssa.update_type ();
303
+ }
304
+ else if (level == L1)
367
305
{
368
- set_ssa_indices (ssa, ns, level );
306
+ set_l1_indices (ssa, ns);
369
307
rename (expr.type (), ssa.get_identifier (), ns, level);
370
308
ssa.update_type ();
371
309
}
372
310
else if (level==L2)
373
311
{
374
- set_ssa_indices (ssa, ns, L1 );
312
+ set_l1_indices (ssa, ns);
375
313
rename (expr.type (), ssa.get_identifier (), ns, level);
376
314
ssa.update_type ();
377
315
@@ -387,13 +325,12 @@ void goto_symex_statet::rename(
387
325
{
388
326
// We also consider propagation if we go up to L2.
389
327
// L1 identifiers are used for propagation!
390
- propagationt::valuest::const_iterator p_it=
391
- propagation.values .find (ssa.get_identifier ());
328
+ auto p_it = propagation.find (ssa.get_identifier ());
392
329
393
- if (p_it!= propagation. values .end ())
330
+ if (p_it != propagation.end ())
394
331
expr=p_it->second ; // already L2
395
332
else
396
- set_ssa_indices (ssa, ns, L2 );
333
+ set_l2_indices (ssa, ns);
397
334
}
398
335
}
399
336
}
@@ -519,7 +456,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
519
456
cond=or_exprt (no_write.op (), cond);
520
457
521
458
if_exprt tmp (cond, ssa_l1, ssa_l1);
522
- set_ssa_indices (to_ssa_expr (tmp.true_case ()), ns, L2 );
459
+ set_l2_indices (to_ssa_expr (tmp.true_case ()), ns);
523
460
524
461
if (a_s_read.second .empty ())
525
462
{
@@ -551,7 +488,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
551
488
source,
552
489
symex_targett::assignment_typet::PHI);
553
490
554
- set_ssa_indices (ssa_l1, ns, L2 );
491
+ set_l2_indices (ssa_l1, ns);
555
492
expr=ssa_l1;
556
493
557
494
a_s_read.second .push_back (guard);
@@ -567,14 +504,14 @@ bool goto_symex_statet::l2_thread_read_encoding(
567
504
// No event and no fresh index, but avoid constant propagation
568
505
if (!record_events)
569
506
{
570
- set_ssa_indices (ssa_l1, ns, L2 );
507
+ set_l2_indices (ssa_l1, ns);
571
508
expr=ssa_l1;
572
509
return true ;
573
510
}
574
511
575
512
// produce a fresh L2 name
576
513
level2.increase_counter (l1_identifier);
577
- set_ssa_indices (ssa_l1, ns, L2 );
514
+ set_l2_indices (ssa_l1, ns);
578
515
expr=ssa_l1;
579
516
580
517
// and record that
@@ -636,7 +573,7 @@ void goto_symex_statet::rename_address(
636
573
ssa_exprt &ssa=to_ssa_expr (expr);
637
574
638
575
// only do L1!
639
- set_ssa_indices (ssa, ns, L1 );
576
+ set_l1_indices (ssa, ns);
640
577
641
578
rename (expr.type (), ssa.get_identifier (), ns, level);
642
579
ssa.update_type ();
0 commit comments