@@ -848,38 +848,39 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
848
848
return unchanged (expr);
849
849
}
850
850
851
- bool simplify_exprt::simplify_dereference (exprt &expr)
851
+ simplify_exprt::resultt<>
852
+ simplify_exprt::simplify_dereference (const dereference_exprt &expr)
852
853
{
853
- const exprt &pointer= to_dereference_expr ( expr) .pointer ();
854
+ const exprt &pointer = expr.pointer ();
854
855
855
856
if (pointer.type ().id ()!=ID_pointer)
856
- return true ;
857
+ return unchanged (expr) ;
857
858
858
859
if (pointer.id ()==ID_if && pointer.operands ().size ()==3 )
859
860
{
860
861
const if_exprt &if_expr=to_if_expr (pointer);
861
862
862
- exprt tmp_op1=expr;
863
- tmp_op1.op0 ()=if_expr.true_case ();
864
- simplify_dereference (tmp_op1);
865
- exprt tmp_op2=expr;
866
- tmp_op2.op0 ()=if_expr.false_case ();
867
- simplify_dereference (tmp_op2);
863
+ auto tmp_op1 = expr;
864
+ tmp_op1.op () = if_expr.true_case ();
865
+ exprt tmp_op1_result = simplify_dereference (tmp_op1);
868
866
869
- expr=if_exprt (if_expr.cond (), tmp_op1, tmp_op2);
867
+ auto tmp_op2 = expr;
868
+ tmp_op2.op () = if_expr.false_case ();
869
+ exprt tmp_op2_result = simplify_dereference (tmp_op2);
870
870
871
- simplify_if ( to_if_expr (expr)) ;
871
+ if_exprt tmp{if_expr. cond (), tmp_op1_result, tmp_op2_result} ;
872
872
873
- return false ;
873
+ simplify_if (tmp);
874
+
875
+ return tmp;
874
876
}
875
877
876
878
if (pointer.id ()==ID_address_of)
877
879
{
878
880
exprt tmp=to_address_of_expr (pointer).object ();
879
881
// one address_of is gone, try again
880
882
simplify_rec (tmp);
881
- expr.swap (tmp);
882
- return false ;
883
+ return tmp;
883
884
}
884
885
// rewrite *(&a[0] + x) to a[x]
885
886
else if (pointer.id ()==ID_plus &&
@@ -898,13 +899,12 @@ bool simplify_exprt::simplify_dereference(exprt &expr)
898
899
pointer_offset_sum (old.index (), pointer.op1 ()),
899
900
old.array ().type ().subtype ());
900
901
simplify_rec (idx);
901
- expr.swap (idx);
902
- return false ;
902
+ return idx;
903
903
}
904
904
}
905
905
}
906
906
907
- return true ;
907
+ return unchanged (expr) ;
908
908
}
909
909
910
910
bool simplify_exprt::simplify_if_implies (
@@ -2491,7 +2491,14 @@ bool simplify_exprt::simplify_node(exprt &expr)
2491
2491
expr.id ()==ID_and)
2492
2492
no_change = simplify_boolean (expr) && no_change;
2493
2493
else if (expr.id ()==ID_dereference)
2494
- no_change = simplify_dereference (expr) && no_change;
2494
+ {
2495
+ auto r = simplify_dereference (to_dereference_expr (expr));
2496
+ if (r.has_changed ())
2497
+ {
2498
+ no_change = false ;
2499
+ expr = r.expr ;
2500
+ }
2501
+ }
2495
2502
else if (expr.id ()==ID_address_of)
2496
2503
no_change = simplify_address_of (expr) && no_change;
2497
2504
else if (expr.id ()==ID_pointer_offset)
0 commit comments