14
14
#include < cstdlib>
15
15
#include < iostream>
16
16
17
- #include < util/as_const.h>
18
17
#include < util/base_exceptions.h>
19
18
#include < util/exception_utils.h>
20
19
#include < util/expr_util.h>
@@ -291,13 +290,31 @@ template ssa_exprt goto_symex_statet::rename_ssa<goto_symex_statet::L1>(
291
290
292
291
template <goto_symex_statet::levelt level>
293
292
exprt goto_symex_statet::rename (exprt expr, const namespacet &ns)
293
+ {
294
+ if (auto renamed = rename_expr<level>(expr, ns))
295
+ return *renamed;
296
+ else
297
+ return expr;
298
+ }
299
+
300
+ // explicitly instantiate templates
301
+ template exprt goto_symex_statet::rename<goto_symex_statet::L1>(
302
+ exprt expr,
303
+ const namespacet &ns);
304
+ template exprt goto_symex_statet::rename<goto_symex_statet::L2>(
305
+ exprt expr,
306
+ const namespacet &ns);
307
+
308
+ template <goto_symex_statet::levelt level>
309
+ optionalt<exprt>
310
+ goto_symex_statet::rename_expr (const exprt &expr, const namespacet &ns)
294
311
{
295
312
// rename all the symbols with their last known value
296
313
297
314
if (expr.id ()==ID_symbol &&
298
315
expr.get_bool (ID_C_SSA_symbol))
299
316
{
300
- ssa_exprt & ssa= to_ssa_expr (expr);
317
+ ssa_exprt ssa = to_ssa_expr (expr);
301
318
302
319
if (level == L0)
303
320
{
@@ -326,7 +343,7 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
326
343
auto p_it = propagation.find (ssa.get_identifier ());
327
344
328
345
if (p_it != propagation.end ())
329
- expr= p_it->second ; // already L2
346
+ return p_it->second ; // already L2
330
347
else
331
348
{
332
349
if (
@@ -340,6 +357,8 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
340
357
set_l2_indices (ssa, ns);
341
358
}
342
359
}
360
+
361
+ return std::move (ssa);
343
362
}
344
363
345
364
if (
@@ -349,6 +368,8 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
349
368
ssa.type () = std::move (*renamed_type);
350
369
ssa.update_type ();
351
370
}
371
+
372
+ return std::move (ssa);
352
373
}
353
374
else if (expr.id ()==ID_symbol)
354
375
{
@@ -359,11 +380,19 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
359
380
auto renamed_type = rename_type<level>(
360
381
expr.type (), to_symbol_expr (expr).get_identifier (), ns))
361
382
{
362
- expr.type () = std::move (*renamed_type);
383
+ exprt result = expr;
384
+ result.type () = std::move (*renamed_type);
385
+ return std::move (result);
363
386
}
387
+ else
388
+ return {};
364
389
}
390
+
391
+ ssa_exprt ssa (expr);
392
+ if (auto renamed = rename_expr<level>(ssa, ns))
393
+ return renamed;
365
394
else
366
- expr = rename <level>(ssa_exprt{expr}, ns );
395
+ return std::move (ssa );
367
396
}
368
397
else if (expr.id ()==ID_address_of)
369
398
{
@@ -375,29 +404,47 @@ exprt goto_symex_statet::rename(exprt expr, const namespacet &ns)
375
404
address_of_exprt result = address_of_expr;
376
405
result.object () = std::move (*renamed_object);
377
406
to_pointer_type (result.type ()).subtype () = result.object ().type ();
378
- expr = std::move (result);
407
+ return std::move (result);
379
408
}
409
+ else
410
+ return {};
380
411
}
381
412
else
382
413
{
414
+ exprt result = expr;
415
+ bool modified = false ;
416
+
383
417
if (auto renamed_type = rename_type<level>(expr.type (), irep_idt (), ns))
384
418
{
385
- expr.type () = std::move (*renamed_type);
419
+ result.type () = std::move (*renamed_type);
420
+ modified = true ;
386
421
}
387
422
388
423
// do this recursively
389
- Forall_operands (it, expr)
390
- *it = rename <level>(std::move (*it), ns);
424
+ exprt::operandst::iterator op_it = result.operands ().begin ();
425
+ forall_operands (it, expr)
426
+ {
427
+ if (auto renamed_op = rename_expr<level>(*it, ns))
428
+ {
429
+ *op_it = std::move (*renamed_op);
430
+ modified = true ;
431
+ }
432
+ ++op_it;
433
+ }
391
434
392
- const exprt &c_expr = as_const (expr);
393
435
INVARIANT (
394
436
(expr.id () != ID_with ||
395
- c_expr .type () == to_with_expr (c_expr ).old ().type ()) &&
437
+ expr .type () == to_with_expr (expr ).old ().type ()) &&
396
438
(expr.id () != ID_if ||
397
- (c_expr .type () == to_if_expr (c_expr ).true_case ().type () &&
398
- c_expr .type () == to_if_expr (c_expr ).false_case ().type ())),
439
+ (expr .type () == to_if_expr (expr ).true_case ().type () &&
440
+ expr .type () == to_if_expr (expr ).false_case ().type ())),
399
441
" Type of renamed expr should be the same as operands for with_exprt and "
400
442
" if_exprt" );
443
+
444
+ if (modified)
445
+ return std::move (result);
446
+ else
447
+ return {};
401
448
}
402
449
return expr;
403
450
}
@@ -616,9 +663,9 @@ goto_symex_statet::rename_address(const exprt &expr, const namespacet &ns)
616
663
auto renamed_array = rename_address<level>(index_expr.array (), ns);
617
664
618
665
// the index is not an address
619
- auto renamed_index = rename <level>(index_expr.index (), ns);
666
+ auto renamed_index = rename_expr <level>(index_expr.index (), ns);
620
667
621
- if (renamed_array.has_value () || renamed_index != index_expr. index ())
668
+ if (renamed_array.has_value () || renamed_index. has_value ())
622
669
{
623
670
index_exprt result = index_expr;
624
671
@@ -628,8 +675,8 @@ goto_symex_statet::rename_address(const exprt &expr, const namespacet &ns)
628
675
result.type () = to_array_type (result.array ().type ()).subtype ();
629
676
}
630
677
631
- if (renamed_index != index_expr. index ())
632
- result.index () = std::move (renamed_index);
678
+ if (renamed_index. has_value ())
679
+ result.index () = std::move (* renamed_index);
633
680
634
681
return std::move (result);
635
682
}
@@ -640,18 +687,18 @@ goto_symex_statet::rename_address(const exprt &expr, const namespacet &ns)
640
687
{
641
688
// the condition is not an address
642
689
const if_exprt &if_expr = to_if_expr (expr);
643
- auto renamed_cond = rename <level>(if_expr.cond (), ns);
690
+ auto renamed_cond = rename_expr <level>(if_expr.cond (), ns);
644
691
auto renamed_true = rename_address<level>(if_expr.true_case (), ns);
645
692
auto renamed_false = rename_address<level>(if_expr.false_case (), ns);
646
693
647
694
if (
648
- renamed_cond != if_expr. cond () || renamed_true.has_value () ||
695
+ renamed_cond. has_value () || renamed_true.has_value () ||
649
696
renamed_false.has_value ())
650
697
{
651
698
if_exprt result = if_expr;
652
699
653
- if (renamed_cond != if_expr. cond ())
654
- result.cond () = std::move (renamed_cond);
700
+ if (renamed_cond. has_value ())
701
+ result.cond () = std::move (* renamed_cond);
655
702
656
703
if (renamed_true.has_value ())
657
704
{
@@ -851,17 +898,17 @@ optionalt<typet> goto_symex_statet::rename_type(
851
898
auto &array_type = to_array_type (type);
852
899
auto renamed_subtype =
853
900
rename_type<level>(array_type.subtype (), irep_idt (), ns);
854
- auto renamed_size = rename <level>(array_type.size (), ns);
901
+ auto renamed_size = rename_expr <level>(array_type.size (), ns);
855
902
856
- if (renamed_subtype.has_value () || renamed_size != array_type. size ())
903
+ if (renamed_subtype.has_value () || renamed_size. has_value ())
857
904
{
858
905
array_typet result_type = array_type;
859
906
860
907
if (renamed_subtype.has_value ())
861
908
result_type.subtype () = std::move (*renamed_subtype);
862
909
863
- if (renamed_size != array_type. size ())
864
- result_type.size () = std::move (renamed_size);
910
+ if (renamed_size. has_value ())
911
+ result_type.size () = std::move (* renamed_size);
865
912
866
913
result = std::move (result_type);
867
914
}
@@ -878,11 +925,11 @@ optionalt<typet> goto_symex_statet::rename_type(
878
925
// be careful, or it might get cyclic
879
926
if (component.type ().id () == ID_array)
880
927
{
881
- auto &array_type = to_array_type (component. type ());
882
- auto renamed_expr = rename <level>(array_type. size (), ns);
883
- if (renamed_expr != array_type. size ())
928
+ if (
929
+ auto renamed_expr =
930
+ rename_expr<level>( to_array_type (component. type ()). size (), ns ))
884
931
{
885
- to_array_type (comp_it->type ()).size () = std::move (renamed_expr);
932
+ to_array_type (comp_it->type ()).size () = std::move (* renamed_expr);
886
933
modified = true ;
887
934
}
888
935
}
0 commit comments