@@ -188,7 +188,7 @@ void goto_symex_statet::assignment(
188
188
const auto level2_it =
189
189
level2.current_names .emplace (l1_identifier, std::make_pair (lhs, 0 )).first ;
190
190
symex_renaming_levelt::increase_counter (level2_it);
191
- set_l2_indices (lhs, ns);
191
+ lhs = set_l2_indices (std::move ( lhs) , ns). get ( );
192
192
193
193
// in case we happen to be multi-threaded, record the memory access
194
194
bool is_shared=l2_thread_write_encoding (lhs, ns);
@@ -235,37 +235,22 @@ void goto_symex_statet::assignment(
235
235
#endif
236
236
}
237
237
238
- void goto_symex_statet::set_l0_indices (
239
- ssa_exprt &ssa_expr,
240
- const namespacet &ns)
238
+ renamedt<ssa_exprt, L0>
239
+ goto_symex_statet::set_l0_indices (ssa_exprt ssa_expr, const namespacet &ns)
241
240
{
242
- renamedt<ssa_exprt, L0> renamed =
243
- level0 (std::move (ssa_expr), ns, source.thread_nr );
244
- ssa_expr = renamed.get ();
241
+ return level0 (std::move (ssa_expr), ns, source.thread_nr );
245
242
}
246
243
247
- void goto_symex_statet::set_l1_indices (
248
- ssa_exprt &ssa_expr,
249
- const namespacet &ns)
244
+ renamedt<ssa_exprt, L1>
245
+ goto_symex_statet::set_l1_indices (ssa_exprt ssa_expr, const namespacet &ns)
250
246
{
251
- if (!ssa_expr.get_level_2 ().empty ())
252
- return ;
253
- if (!ssa_expr.get_level_1 ().empty ())
254
- return ;
255
- renamedt<ssa_exprt, L1> l1 =
256
- level1 (level0 (std::move (ssa_expr), ns, source.thread_nr ));
257
- ssa_expr = l1.get ();
247
+ return level1 (level0 (std::move (ssa_expr), ns, source.thread_nr ));
258
248
}
259
249
260
- void goto_symex_statet::set_l2_indices (
261
- ssa_exprt &ssa_expr,
262
- const namespacet &ns)
250
+ renamedt<ssa_exprt, L2>
251
+ goto_symex_statet::set_l2_indices (ssa_exprt ssa_expr, const namespacet &ns)
263
252
{
264
- if (!ssa_expr.get_level_2 ().empty ())
265
- return ;
266
- renamedt<ssa_exprt, L2> l2 =
267
- level2 (level1 (level0 (std::move (ssa_expr), ns, source.thread_nr )));
268
- ssa_expr = l2.get ();
253
+ return level2 (level1 (level0 (std::move (ssa_expr), ns, source.thread_nr )));
269
254
}
270
255
271
256
template <levelt level>
@@ -275,9 +260,9 @@ ssa_exprt goto_symex_statet::rename_ssa(ssa_exprt ssa, const namespacet &ns)
275
260
level == L0 || level == L1,
276
261
" rename_ssa can only be used for levels L0 and L1" );
277
262
if (level == L0)
278
- set_l0_indices (ssa, ns);
263
+ ssa = set_l0_indices (std::move ( ssa) , ns). get ( );
279
264
else if (level == L1)
280
- set_l1_indices (ssa, ns);
265
+ ssa = set_l1_indices (std::move ( ssa) , ns). get ( );
281
266
else
282
267
UNREACHABLE;
283
268
@@ -312,7 +297,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
312
297
}
313
298
else if (level==L2)
314
299
{
315
- set_l1_indices (ssa, ns);
300
+ ssa = set_l1_indices (std::move ( ssa) , ns). get ( );
316
301
rename <level>(expr.type (), ssa.get_identifier (), ns);
317
302
ssa.update_type ();
318
303
@@ -333,7 +318,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
333
318
if (p_it != propagation.end ())
334
319
expr=p_it->second ; // already L2
335
320
else
336
- set_l2_indices (ssa, ns);
321
+ ssa = set_l2_indices (std::move ( ssa) , ns). get ( );
337
322
}
338
323
}
339
324
}
@@ -447,8 +432,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
447
432
if (!no_write.op ().is_false ())
448
433
cond |= guardt{no_write.op ()};
449
434
450
- if_exprt tmp (cond.as_expr (), ssa_l1, ssa_l1);
451
- set_l2_indices (to_ssa_expr (tmp.true_case ()), ns);
435
+ const renamedt<ssa_exprt, L2> l2_true_case = set_l2_indices (ssa_l1, ns);
452
436
453
437
if (a_s_read.second .empty ())
454
438
{
@@ -458,14 +442,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
458
442
symex_renaming_levelt::increase_counter (level2_it);
459
443
a_s_read.first =level2.current_count (l1_identifier);
460
444
}
445
+ const renamedt<ssa_exprt, L2> l2_false_case = set_l2_indices (ssa_l1, ns);
461
446
462
- to_ssa_expr (tmp.false_case ()).set_level_2 (a_s_read.first );
463
-
447
+ exprt tmp;
464
448
if (cond.is_false ())
465
- {
466
- exprt t=tmp.false_case ();
467
- t.swap (tmp);
468
- }
449
+ tmp = l2_false_case.get ();
450
+ else
451
+ tmp = if_exprt{cond.as_expr (), l2_true_case.get (), l2_false_case.get ()};
469
452
470
453
const bool record_events_bak=record_events;
471
454
record_events=false ;
@@ -481,8 +464,7 @@ bool goto_symex_statet::l2_thread_read_encoding(
481
464
source,
482
465
symex_targett::assignment_typet::PHI);
483
466
484
- set_l2_indices (ssa_l1, ns);
485
- expr=ssa_l1;
467
+ expr = set_l2_indices (std::move (ssa_l1), ns).get ();
486
468
487
469
a_s_read.second .push_back (guard);
488
470
if (!no_write.op ().is_false ())
@@ -498,15 +480,13 @@ bool goto_symex_statet::l2_thread_read_encoding(
498
480
// No event and no fresh index, but avoid constant propagation
499
481
if (!record_events)
500
482
{
501
- set_l2_indices (ssa_l1, ns);
502
- expr=ssa_l1;
483
+ expr = set_l2_indices (std::move (ssa_l1), ns).get ();
503
484
return true ;
504
485
}
505
486
506
487
// produce a fresh L2 name
507
488
symex_renaming_levelt::increase_counter (level2_it);
508
- set_l2_indices (ssa_l1, ns);
509
- expr=ssa_l1;
489
+ expr = set_l2_indices (std::move (ssa_l1), ns).get ();
510
490
511
491
// and record that
512
492
INVARIANT_STRUCTURED (
@@ -563,7 +543,7 @@ void goto_symex_statet::rename_address(exprt &expr, const namespacet &ns)
563
543
ssa_exprt &ssa=to_ssa_expr (expr);
564
544
565
545
// only do L1!
566
- set_l1_indices (ssa, ns);
546
+ ssa = set_l1_indices (std::move ( ssa) , ns). get ( );
567
547
568
548
rename <level>(expr.type (), ssa.get_identifier (), ns);
569
549
ssa.update_type ();
0 commit comments