Skip to content

Commit 7c9c513

Browse files
committed
Maintain ID_C_expr_simplified
1 parent e2afe93 commit 7c9c513

7 files changed

+80
-32
lines changed

src/goto-symex/goto_symex.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,13 @@ class goto_symext
131131
statet &state,
132132
const bool write);
133133

134-
void dereference_rec(
134+
bool dereference_rec(
135135
exprt &expr,
136136
statet &state,
137137
guardt &guard,
138138
const bool write);
139139

140-
void dereference_rec_address_of(
140+
bool dereference_rec_address_of(
141141
exprt &expr,
142142
statet &state,
143143
guardt &guard);

src/goto-symex/goto_symex_state.cpp

+30-14
Original file line numberDiff line numberDiff line change
@@ -436,12 +436,13 @@ void goto_symex_statet::set_ssa_indices(
436436
}
437437
}
438438

439-
void goto_symex_statet::rename(
439+
bool goto_symex_statet::rename(
440440
exprt &expr,
441441
const namespacet &ns,
442442
levelt level)
443443
{
444444
// rename all the symbols with their last known value
445+
bool result=false;
445446

446447
if(expr.id()==ID_symbol &&
447448
expr.get_bool(ID_C_SSA_symbol))
@@ -476,7 +477,10 @@ void goto_symex_statet::rename(
476477
propagation.values.find(ssa.get_identifier());
477478

478479
if(p_it!=propagation.values.end())
480+
{
479481
expr=p_it->second; // already L2
482+
result=true;
483+
}
480484
else
481485
set_ssa_indices(ssa, ns, L2);
482486
}
@@ -493,16 +497,16 @@ void goto_symex_statet::rename(
493497
ns,
494498
level);
495499

496-
return;
500+
return false;
497501
}
498502

499503
expr=ssa_exprt(expr);
500-
rename(expr, ns, level);
504+
result=rename(expr, ns, level);
501505
}
502506
else if(expr.id()==ID_address_of)
503507
{
504508
assert(expr.operands().size()==1);
505-
rename_address(expr.op0(), ns, level);
509+
result=rename_address(expr.op0(), ns, level);
506510
assert(expr.type().id()==ID_pointer);
507511
expr.type().subtype()=expr.op0().type();
508512
}
@@ -513,7 +517,7 @@ void goto_symex_statet::rename(
513517

514518
// do this recursively
515519
Forall_operands(it, expr)
516-
rename(*it, ns, level);
520+
result=rename(*it, ns, level) || result;
517521

518522
// some fixes
519523
if(expr.id()==ID_with)
@@ -525,6 +529,11 @@ void goto_symex_statet::rename(
525529
expr.type()=to_if_expr(expr).true_case().type();
526530
}
527531
}
532+
533+
if(result)
534+
expr.remove(ID_C_expr_simplified);
535+
536+
return result;
528537
}
529538

530539
/// thread encoding
@@ -709,11 +718,13 @@ bool goto_symex_statet::l2_thread_write_encoding(
709718
return threads.size()>1;
710719
}
711720

712-
void goto_symex_statet::rename_address(
721+
bool goto_symex_statet::rename_address(
713722
exprt &expr,
714723
const namespacet &ns,
715724
levelt level)
716725
{
726+
bool result=false;
727+
717728
if(expr.id()==ID_symbol &&
718729
expr.get_bool(ID_C_SSA_symbol))
719730
{
@@ -728,36 +739,36 @@ void goto_symex_statet::rename_address(
728739
else if(expr.id()==ID_symbol)
729740
{
730741
expr=ssa_exprt(expr);
731-
rename_address(expr, ns, level);
742+
result=rename_address(expr, ns, level);
732743
}
733744
else
734745
{
735746
if(expr.id()==ID_index)
736747
{
737748
index_exprt &index_expr=to_index_expr(expr);
738749

739-
rename_address(index_expr.array(), ns, level);
750+
result=rename_address(index_expr.array(), ns, level);
740751
assert(index_expr.array().type().id()==ID_array);
741752
expr.type()=index_expr.array().type().subtype();
742753

743754
// the index is not an address
744-
rename(index_expr.index(), ns, level);
755+
result=rename(index_expr.index(), ns, level) || result;
745756
}
746757
else if(expr.id()==ID_if)
747758
{
748759
// the condition is not an address
749760
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;
753764

754765
if_expr.type()=if_expr.true_case().type();
755766
}
756767
else if(expr.id()==ID_member)
757768
{
758769
member_exprt &member_expr=to_member_expr(expr);
759770

760-
rename_address(member_expr.struct_op(), ns, level);
771+
result=rename_address(member_expr.struct_op(), ns, level);
761772

762773
// type might not have been renamed in case of nesting of
763774
// structs and pointers/arrays
@@ -781,9 +792,14 @@ void goto_symex_statet::rename_address(
781792
// do this recursively; we assume here
782793
// that all the operands are addresses
783794
Forall_operands(it, expr)
784-
rename_address(*it, ns, level);
795+
result=rename_address(*it, ns, level) || result;
785796
}
786797
}
798+
799+
if(result)
800+
expr.remove(ID_C_expr_simplified);
801+
802+
return result;
787803
}
788804

789805
void goto_symex_statet::rename(

src/goto-symex/goto_symex_state.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class goto_symex_statet
148148
enum levelt { L0=0, L1=1, L2=2 };
149149

150150
// performs renaming _up to_ the given level
151-
void rename(exprt &expr, const namespacet &ns, levelt level=L2);
151+
bool rename(exprt &expr, const namespacet &ns, levelt level=L2);
152152
void rename(
153153
typet &type,
154154
const irep_idt &l1_identifier,
@@ -170,7 +170,7 @@ class goto_symex_statet
170170
void get_original_name(exprt &expr) const;
171171
void get_original_name(typet &type) const;
172172
protected:
173-
void rename_address(exprt &expr, const namespacet &ns, levelt level);
173+
bool rename_address(exprt &expr, const namespacet &ns, levelt level);
174174

175175
void set_ssa_indices(ssa_exprt &expr, const namespacet &ns, levelt level=L2);
176176
// only required for value_set.assign

src/goto-symex/symex_dereference.cpp

+33-14
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,48 @@ Author: Daniel Kroening, [email protected]
2323
#include "goto_symex.h"
2424
#include "symex_dereference_state.h"
2525

26-
void goto_symext::dereference_rec_address_of(
26+
bool goto_symext::dereference_rec_address_of(
2727
exprt &expr,
2828
statet &state,
2929
guardt &guard)
3030
{
31+
bool result=false;
32+
3133
// Could be member, could be if, could be index.
3234

3335
if(expr.id()==ID_member)
34-
dereference_rec_address_of(
36+
result=dereference_rec_address_of(
3537
to_member_expr(expr).struct_op(), state, guard);
3638
else if(expr.id()==ID_if)
3739
{
3840
// the condition is not an address
39-
dereference_rec(
41+
result=dereference_rec(
4042
to_if_expr(expr).cond(), state, guard, false);
4143

4244
// add to guard?
43-
dereference_rec_address_of(
44-
to_if_expr(expr).true_case(), state, guard);
45-
dereference_rec_address_of(
46-
to_if_expr(expr).false_case(), state, guard);
45+
result=dereference_rec_address_of(
46+
to_if_expr(expr).true_case(), state, guard) || result;
47+
result=dereference_rec_address_of(
48+
to_if_expr(expr).false_case(), state, guard) || result;
4749
}
4850
else if(expr.id()==ID_index)
4951
{
5052
// the index is not an address
51-
dereference_rec(
53+
result=dereference_rec(
5254
to_index_expr(expr).index(), state, guard, false);
5355

5456
// the array _is_ an address
55-
dereference_rec_address_of(
56-
to_index_expr(expr).array(), state, guard);
57+
result=dereference_rec_address_of(
58+
to_index_expr(expr).array(), state, guard) || result;
5759
}
5860
else
5961
{
6062
// give up and dereference
6163

62-
dereference_rec(expr, state, guard, false);
64+
result=dereference_rec(expr, state, guard, false);
6365
}
66+
67+
return result;
6468
}
6569

6670
bool goto_symext::is_index_member_symbol_if(const exprt &expr)
@@ -226,12 +230,14 @@ exprt goto_symext::address_arithmetic(
226230
return result;
227231
}
228232

229-
void goto_symext::dereference_rec(
233+
bool goto_symext::dereference_rec(
230234
exprt &expr,
231235
statet &state,
232236
guardt &guard,
233237
const bool write)
234238
{
239+
bool result=false;
240+
235241
if(expr.id()==ID_dereference)
236242
{
237243
if(expr.operands().size()!=1)
@@ -267,6 +273,8 @@ void goto_symext::dereference_rec(
267273

268274
// this may yield a new auto-object
269275
trigger_auto_object(expr, state);
276+
277+
result=true;
270278
}
271279
else if(expr.id()==ID_index &&
272280
to_index_expr(expr).array().id()==ID_member &&
@@ -291,6 +299,8 @@ void goto_symext::dereference_rec(
291299
dereference_rec(tmp, state, guard, write);
292300

293301
expr.swap(tmp);
302+
303+
result=true;
294304
}
295305
else if(expr.id()==ID_index &&
296306
to_index_expr(expr).array().type().id()==ID_pointer)
@@ -307,6 +317,8 @@ void goto_symext::dereference_rec(
307317
const typet &expr_type=ns.follow(expr.type());
308318
expr=address_arithmetic(object, state, guard,
309319
expr_type.subtype().id()==ID_array);
320+
321+
result=true;
310322
}
311323
else if(expr.id()==ID_typecast)
312324
{
@@ -327,17 +339,24 @@ void goto_symext::dereference_rec(
327339
from_integer(0, index_type())));
328340

329341
dereference_rec(expr, state, guard, write);
342+
343+
result=true;
330344
}
331345
else
332346
{
333-
dereference_rec(tc_op, state, guard, write);
347+
result=dereference_rec(tc_op, state, guard, write) || result;
334348
}
335349
}
336350
else
337351
{
338352
Forall_operands(it, expr)
339-
dereference_rec(*it, state, guard, write);
353+
result=dereference_rec(*it, state, guard, write) || result;
340354
}
355+
356+
if(result)
357+
expr.remove(ID_C_expr_simplified);
358+
359+
return result;
341360
}
342361

343362
void goto_symext::dereference(

src/util/irep_ids.def

+1
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ IREP_ID_ONE(cprover_string_to_upper_case_func)
810810
IREP_ID_ONE(cprover_string_trim_func)
811811
IREP_ID_ONE(cprover_string_value_of_func)
812812
IREP_ID_ONE(array_replace)
813+
IREP_ID_TWO(C_expr_simplified, #expr_simplified)
813814

814815
#undef IREP_ID_ONE
815816
#undef IREP_ID_TWO

src/util/replace_expr.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ bool replace_expr(const exprt &what, const exprt &by, exprt &dest)
2222
Forall_operands(it, dest)
2323
result=replace_expr(what, by, *it) && result;
2424

25+
if(!result)
26+
dest.remove(ID_C_expr_simplified);
27+
2528
return result;
2629
}
2730

@@ -42,5 +45,8 @@ bool replace_expr(const replace_mapt &what, exprt &dest)
4245
Forall_operands(it, dest)
4346
result=replace_expr(what, *it) && result;
4447

48+
if(!result)
49+
dest.remove(ID_C_expr_simplified);
50+
4551
return result;
4652
}

src/util/replace_symbol.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ bool replace_symbolt::replace(exprt &dest) const
7070
!replace(static_cast<typet&>(dest.add(ID_C_va_arg_type))))
7171
result=false;
7272

73+
if(!result)
74+
dest.remove(ID_C_expr_simplified);
75+
7376
return result;
7477
}
7578

@@ -162,6 +165,9 @@ bool replace_symbolt::replace(typet &dest) const
162165
result=false;
163166
}
164167

168+
if(!result)
169+
dest.remove(ID_C_expr_simplified);
170+
165171
return result;
166172
}
167173

0 commit comments

Comments
 (0)