@@ -436,12 +436,13 @@ void goto_symex_statet::set_ssa_indices(
436
436
}
437
437
}
438
438
439
- void goto_symex_statet::rename (
439
+ bool goto_symex_statet::rename (
440
440
exprt &expr,
441
441
const namespacet &ns,
442
442
levelt level)
443
443
{
444
444
// rename all the symbols with their last known value
445
+ bool result=false ;
445
446
446
447
if (expr.id ()==ID_symbol &&
447
448
expr.get_bool (ID_C_SSA_symbol))
@@ -476,7 +477,10 @@ void goto_symex_statet::rename(
476
477
propagation.values .find (ssa.get_identifier ());
477
478
478
479
if (p_it!=propagation.values .end ())
480
+ {
479
481
expr=p_it->second ; // already L2
482
+ result=true ;
483
+ }
480
484
else
481
485
set_ssa_indices (ssa, ns, L2);
482
486
}
@@ -493,16 +497,16 @@ void goto_symex_statet::rename(
493
497
ns,
494
498
level);
495
499
496
- return ;
500
+ return false ;
497
501
}
498
502
499
503
expr=ssa_exprt (expr);
500
- rename (expr, ns, level);
504
+ result= rename (expr, ns, level);
501
505
}
502
506
else if (expr.id ()==ID_address_of)
503
507
{
504
508
assert (expr.operands ().size ()==1 );
505
- rename_address (expr.op0 (), ns, level);
509
+ result= rename_address (expr.op0 (), ns, level);
506
510
assert (expr.type ().id ()==ID_pointer);
507
511
expr.type ().subtype ()=expr.op0 ().type ();
508
512
}
@@ -513,7 +517,7 @@ void goto_symex_statet::rename(
513
517
514
518
// do this recursively
515
519
Forall_operands (it, expr)
516
- rename (*it, ns, level);
520
+ result= rename (*it, ns, level) || result ;
517
521
518
522
// some fixes
519
523
if (expr.id ()==ID_with)
@@ -525,6 +529,11 @@ void goto_symex_statet::rename(
525
529
expr.type ()=to_if_expr (expr).true_case ().type ();
526
530
}
527
531
}
532
+
533
+ if (result)
534
+ expr.remove (ID_C_expr_simplified);
535
+
536
+ return result;
528
537
}
529
538
530
539
// / thread encoding
@@ -709,11 +718,13 @@ bool goto_symex_statet::l2_thread_write_encoding(
709
718
return threads.size ()>1 ;
710
719
}
711
720
712
- void goto_symex_statet::rename_address (
721
+ bool goto_symex_statet::rename_address (
713
722
exprt &expr,
714
723
const namespacet &ns,
715
724
levelt level)
716
725
{
726
+ bool result=false ;
727
+
717
728
if (expr.id ()==ID_symbol &&
718
729
expr.get_bool (ID_C_SSA_symbol))
719
730
{
@@ -728,36 +739,36 @@ void goto_symex_statet::rename_address(
728
739
else if (expr.id ()==ID_symbol)
729
740
{
730
741
expr=ssa_exprt (expr);
731
- rename_address (expr, ns, level);
742
+ result= rename_address (expr, ns, level);
732
743
}
733
744
else
734
745
{
735
746
if (expr.id ()==ID_index)
736
747
{
737
748
index_exprt &index_expr=to_index_expr (expr);
738
749
739
- rename_address (index_expr.array (), ns, level);
750
+ result= rename_address (index_expr.array (), ns, level);
740
751
assert (index_expr.array ().type ().id ()==ID_array);
741
752
expr.type ()=index_expr.array ().type ().subtype ();
742
753
743
754
// the index is not an address
744
- rename (index_expr.index (), ns, level);
755
+ result= rename (index_expr.index (), ns, level) || result ;
745
756
}
746
757
else if (expr.id ()==ID_if)
747
758
{
748
759
// the condition is not an address
749
760
if_exprt &if_expr=to_if_expr (expr);
750
- rename (if_expr.cond (), ns, level);
751
- rename_address (if_expr.true_case (), ns, level);
752
- rename_address (if_expr.false_case (), ns, level);
761
+ result= rename (if_expr.cond (), ns, level);
762
+ result= rename_address (if_expr.true_case (), ns, level) || result ;
763
+ result= rename_address (if_expr.false_case (), ns, level) || result ;
753
764
754
765
if_expr.type ()=if_expr.true_case ().type ();
755
766
}
756
767
else if (expr.id ()==ID_member)
757
768
{
758
769
member_exprt &member_expr=to_member_expr (expr);
759
770
760
- rename_address (member_expr.struct_op (), ns, level);
771
+ result= rename_address (member_expr.struct_op (), ns, level);
761
772
762
773
// type might not have been renamed in case of nesting of
763
774
// structs and pointers/arrays
@@ -781,9 +792,14 @@ void goto_symex_statet::rename_address(
781
792
// do this recursively; we assume here
782
793
// that all the operands are addresses
783
794
Forall_operands (it, expr)
784
- rename_address (*it, ns, level);
795
+ result= rename_address (*it, ns, level) || result ;
785
796
}
786
797
}
798
+
799
+ if (result)
800
+ expr.remove (ID_C_expr_simplified);
801
+
802
+ return result;
787
803
}
788
804
789
805
void goto_symex_statet::rename (
0 commit comments