Skip to content

Commit d314770

Browse files
authored
Merge pull request #3465 from diffblue/expr-op-cleanup
exprt::opX cleanup
2 parents 961d974 + 0942e1f commit d314770

12 files changed

+123
-123
lines changed

src/analyses/constant_propagator.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,8 @@ void constant_propagator_ait::replace(
631631
d.partial_evaluate(rhs, ns);
632632

633633
if(rhs.id()==ID_constant)
634-
rhs.add_source_location()=it->code.op0().source_location();
634+
rhs.add_source_location() =
635+
to_code_assign(it->code).lhs().source_location();
635636
}
636637
else if(it->is_function_call())
637638
{

src/analyses/escape_analysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void escape_domaint::get_rhs_aliases(
142142
}
143143
else if(rhs.id()==ID_address_of)
144144
{
145-
get_rhs_aliases_address_of(to_address_of_expr(rhs).op0(), alias_set);
145+
get_rhs_aliases_address_of(to_address_of_expr(rhs).op(), alias_set);
146146
}
147147
}
148148

src/analyses/flow_insensitive_analysis.cpp

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -317,24 +317,15 @@ bool flow_insensitive_analysis_baset::do_function_call_rec(
317317
}
318318
else if(function.id()==ID_if)
319319
{
320-
if(function.operands().size()!=3)
321-
throw "if takes three arguments";
320+
const auto &if_expr = to_if_expr(function);
322321

323-
new_data =
324-
do_function_call_rec(
325-
l_call,
326-
function.op1(),
327-
arguments,
328-
state,
329-
goto_functions);
322+
new_data = do_function_call_rec(
323+
l_call, if_expr.true_case(), arguments, state, goto_functions);
330324

331325
new_data =
332326
do_function_call_rec(
333-
l_call,
334-
function.op2(),
335-
arguments,
336-
state,
337-
goto_functions) || new_data;
327+
l_call, if_expr.false_case(), arguments, state, goto_functions) ||
328+
new_data;
338329
}
339330
else if(function.id()==ID_dereference)
340331
{

src/analyses/global_may_alias.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void global_may_alias_domaint::get_rhs_aliases(
6262
}
6363
else if(rhs.id()==ID_address_of)
6464
{
65-
get_rhs_aliases_address_of(to_address_of_expr(rhs).op0(), alias_set);
65+
get_rhs_aliases_address_of(to_address_of_expr(rhs).object(), alias_set);
6666
}
6767
}
6868

src/analyses/interval_domain.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -339,25 +339,25 @@ void interval_domaint::assume_rec(
339339
cond.id()==ID_gt || cond.id()==ID_ge ||
340340
cond.id()==ID_equal || cond.id()==ID_notequal)
341341
{
342-
assert(cond.operands().size()==2);
342+
const auto &rel = to_binary_relation_expr(cond);
343343

344344
if(negation) // !x<y ---> x>=y
345345
{
346-
if(cond.id()==ID_lt)
347-
assume_rec(cond.op0(), ID_ge, cond.op1());
348-
else if(cond.id()==ID_le)
349-
assume_rec(cond.op0(), ID_gt, cond.op1());
350-
else if(cond.id()==ID_gt)
351-
assume_rec(cond.op0(), ID_le, cond.op1());
352-
else if(cond.id()==ID_ge)
353-
assume_rec(cond.op0(), ID_lt, cond.op1());
354-
else if(cond.id()==ID_equal)
355-
assume_rec(cond.op0(), ID_notequal, cond.op1());
356-
else if(cond.id()==ID_notequal)
357-
assume_rec(cond.op0(), ID_equal, cond.op1());
346+
if(rel.id() == ID_lt)
347+
assume_rec(rel.op0(), ID_ge, rel.op1());
348+
else if(rel.id() == ID_le)
349+
assume_rec(rel.op0(), ID_gt, rel.op1());
350+
else if(rel.id() == ID_gt)
351+
assume_rec(rel.op0(), ID_le, rel.op1());
352+
else if(rel.id() == ID_ge)
353+
assume_rec(rel.op0(), ID_lt, rel.op1());
354+
else if(rel.id() == ID_equal)
355+
assume_rec(rel.op0(), ID_notequal, rel.op1());
356+
else if(rel.id() == ID_notequal)
357+
assume_rec(rel.op0(), ID_equal, rel.op1());
358358
}
359359
else
360-
assume_rec(cond.op0(), cond.id(), cond.op1());
360+
assume_rec(rel.op0(), rel.id(), rel.op1());
361361
}
362362
else if(cond.id()==ID_not)
363363
{

src/analyses/invariant_set.cpp

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,26 @@ std::string inv_object_storet::build_string(const exprt &expr) const
9595
// we ignore some casts
9696
if(expr.id()==ID_typecast)
9797
{
98-
assert(expr.operands().size()==1);
98+
const auto &typecast_expr = to_typecast_expr(expr);
9999

100-
if(expr.type().id()==ID_signedbv ||
101-
expr.type().id()==ID_unsignedbv)
100+
if(
101+
typecast_expr.type().id() == ID_signedbv ||
102+
typecast_expr.type().id() == ID_unsignedbv)
102103
{
103-
if(expr.op0().type().id()==ID_signedbv ||
104-
expr.op0().type().id()==ID_unsignedbv)
104+
const typet &op_type = typecast_expr.op().type();
105+
106+
if(op_type.id() == ID_signedbv || op_type.id() == ID_unsignedbv)
105107
{
106-
if(to_bitvector_type(expr.type()).get_width()>=
107-
to_bitvector_type(expr.op0().type()).get_width())
108-
return build_string(expr.op0());
108+
if(
109+
to_bitvector_type(typecast_expr.type()).get_width() >=
110+
to_bitvector_type(op_type).get_width())
111+
{
112+
return build_string(typecast_expr.op());
113+
}
109114
}
110-
else if(expr.op0().type().id()==ID_bool)
115+
else if(op_type.id() == ID_bool)
111116
{
112-
return build_string(expr.op0());
117+
return build_string(typecast_expr.op());
113118
}
114119
}
115120
}
@@ -137,8 +142,8 @@ std::string inv_object_storet::build_string(const exprt &expr) const
137142

138143
if(expr.id()==ID_member)
139144
{
140-
assert(expr.operands().size()==1);
141-
return build_string(expr.op0())+"."+expr.get_string(ID_component_name);
145+
return build_string(to_member_expr(expr).compound()) + "." +
146+
expr.get_string(ID_component_name);
142147
}
143148

144149
if(expr.id()==ID_symbol)
@@ -158,8 +163,7 @@ bool invariant_sett::get_object(
158163
bool inv_object_storet::is_constant_address(const exprt &expr)
159164
{
160165
if(expr.id()==ID_address_of)
161-
if(expr.operands().size()==1)
162-
return is_constant_address_rec(expr.op0());
166+
return is_constant_address_rec(to_address_of_expr(expr).object());
163167

164168
return false;
165169
}
@@ -169,15 +173,12 @@ bool inv_object_storet::is_constant_address_rec(const exprt &expr)
169173
if(expr.id()==ID_symbol)
170174
return true;
171175
else if(expr.id()==ID_member)
172-
{
173-
assert(expr.operands().size()==1);
174-
return is_constant_address_rec(expr.op0());
175-
}
176+
return is_constant_address_rec(to_member_expr(expr).compound());
176177
else if(expr.id()==ID_index)
177178
{
178-
assert(expr.operands().size()==2);
179-
if(expr.op1().is_constant())
180-
return is_constant_address_rec(expr.op0());
179+
const auto &index_expr = to_index_expr(expr);
180+
if(index_expr.index().is_constant())
181+
return is_constant_address_rec(index_expr.array());
181182
}
182183

183184
return false;
@@ -429,14 +430,14 @@ void invariant_sett::strengthen_rec(const exprt &expr)
429430
else if(expr.id()==ID_le ||
430431
expr.id()==ID_lt)
431432
{
432-
assert(expr.operands().size()==2);
433+
const auto &rel = to_binary_relation_expr(expr);
433434

434435
// special rule: x <= (a & b)
435436
// implies: x<=a && x<=b
436437

437-
if(expr.op1().id()==ID_bitand)
438+
if(rel.op1().id() == ID_bitand)
438439
{
439-
const exprt &bitand_op=expr.op1();
440+
const exprt &bitand_op = rel.op1();
440441

441442
forall_operands(it, bitand_op)
442443
{
@@ -450,12 +451,11 @@ void invariant_sett::strengthen_rec(const exprt &expr)
450451

451452
std::pair<unsigned, unsigned> p;
452453

453-
if(get_object(expr.op0(), p.first) ||
454-
get_object(expr.op1(), p.second))
454+
if(get_object(rel.op0(), p.first) || get_object(rel.op1(), p.second))
455455
return;
456456

457-
const auto i0 = numeric_cast<mp_integer>(expr.op0());
458-
const auto i1 = numeric_cast<mp_integer>(expr.op1());
457+
const auto i0 = numeric_cast<mp_integer>(rel.op0());
458+
const auto i1 = numeric_cast<mp_integer>(rel.op1());
459459

460460
if(expr.id()==ID_le)
461461
{
@@ -483,9 +483,9 @@ void invariant_sett::strengthen_rec(const exprt &expr)
483483
}
484484
else if(expr.id()==ID_equal)
485485
{
486-
assert(expr.operands().size()==2);
486+
const auto &equal_expr = to_equal_expr(expr);
487487

488-
const typet &op_type=ns->follow(expr.op0().type());
488+
const typet &op_type = ns->follow(equal_expr.op0().type());
489489

490490
if(op_type.id()==ID_struct)
491491
{
@@ -495,9 +495,9 @@ void invariant_sett::strengthen_rec(const exprt &expr)
495495
for(const auto &comp : struct_type.components())
496496
{
497497
const member_exprt lhs_member_expr(
498-
expr.op0(), comp.get_name(), comp.type());
498+
equal_expr.op0(), comp.get_name(), comp.type());
499499
const member_exprt rhs_member_expr(
500-
expr.op1(), comp.get_name(), comp.type());
500+
equal_expr.op1(), comp.get_name(), comp.type());
501501

502502
const equal_exprt equality(lhs_member_expr, rhs_member_expr);
503503

@@ -511,48 +511,51 @@ void invariant_sett::strengthen_rec(const exprt &expr)
511511
// special rule: x = (a & b)
512512
// implies: x<=a && x<=b
513513

514-
if(expr.op1().id()==ID_bitand)
514+
if(equal_expr.op1().id() == ID_bitand)
515515
{
516-
const exprt &bitand_op=expr.op1();
516+
const exprt &bitand_op = equal_expr.op1();
517517

518518
forall_operands(it, bitand_op)
519519
{
520-
exprt tmp(expr);
520+
exprt tmp(equal_expr);
521521
tmp.op1()=*it;
522522
tmp.id(ID_le);
523523
strengthen_rec(tmp);
524524
}
525525

526526
return;
527527
}
528-
else if(expr.op0().id()==ID_bitand)
528+
else if(equal_expr.op0().id() == ID_bitand)
529529
{
530-
exprt tmp(expr);
530+
exprt tmp(equal_expr);
531531
std::swap(tmp.op0(), tmp.op1());
532532
strengthen_rec(tmp);
533533
return;
534534
}
535535

536536
// special rule: x = (type) y
537-
if(expr.op1().id()==ID_typecast)
537+
if(equal_expr.op1().id() == ID_typecast)
538538
{
539-
assert(expr.op1().operands().size()==1);
540-
add_type_bounds(expr.op0(), expr.op1().op0().type());
539+
const auto &typecast_expr = to_typecast_expr(equal_expr.op1());
540+
add_type_bounds(equal_expr.op0(), typecast_expr.op().type());
541541
}
542-
else if(expr.op0().id()==ID_typecast)
542+
else if(equal_expr.op0().id() == ID_typecast)
543543
{
544-
assert(expr.op0().operands().size()==1);
545-
add_type_bounds(expr.op1(), expr.op0().op0().type());
544+
const auto &typecast_expr = to_typecast_expr(equal_expr.op0());
545+
add_type_bounds(equal_expr.op1(), typecast_expr.op().type());
546546
}
547547

548548
std::pair<unsigned, unsigned> p, s;
549549

550-
if(get_object(expr.op0(), p.first) ||
551-
get_object(expr.op1(), p.second))
550+
if(
551+
get_object(equal_expr.op0(), p.first) ||
552+
get_object(equal_expr.op1(), p.second))
553+
{
552554
return;
555+
}
553556

554-
const auto i0 = numeric_cast<mp_integer>(expr.op0());
555-
const auto i1 = numeric_cast<mp_integer>(expr.op1());
557+
const auto i0 = numeric_cast<mp_integer>(equal_expr.op0());
558+
const auto i1 = numeric_cast<mp_integer>(equal_expr.op1());
556559
if(i0.has_value())
557560
add_bounds(p.second, boundst(*i0));
558561
else if(i1.has_value())
@@ -569,13 +572,16 @@ void invariant_sett::strengthen_rec(const exprt &expr)
569572
}
570573
else if(expr.id()==ID_notequal)
571574
{
572-
assert(expr.operands().size()==2);
575+
const auto &notequal_expr = to_notequal_expr(expr);
573576

574577
std::pair<unsigned, unsigned> p;
575578

576-
if(get_object(expr.op0(), p.first) ||
577-
get_object(expr.op1(), p.second))
579+
if(
580+
get_object(notequal_expr.op0(), p.first) ||
581+
get_object(notequal_expr.op1(), p.second))
582+
{
578583
return;
584+
}
579585

580586
// check if this is a contradiction
581587
if(has_eq(p))
@@ -629,19 +635,19 @@ tvt invariant_sett::implies_rec(const exprt &expr) const
629635
expr.id()==ID_equal ||
630636
expr.id()==ID_notequal)
631637
{
632-
assert(expr.operands().size()==2);
638+
const auto &rel = to_binary_relation_expr(expr);
633639

634640
std::pair<unsigned, unsigned> p;
635641

636-
bool ob0=get_object(expr.op0(), p.first);
637-
bool ob1=get_object(expr.op1(), p.second);
642+
bool ob0 = get_object(rel.op0(), p.first);
643+
bool ob1 = get_object(rel.op1(), p.second);
638644

639645
if(ob0 || ob1)
640646
return tvt::unknown();
641647

642648
tvt r;
643649

644-
if(expr.id()==ID_le)
650+
if(rel.id() == ID_le)
645651
{
646652
r=is_le(p);
647653
if(!r.is_unknown())
@@ -653,7 +659,7 @@ tvt invariant_sett::implies_rec(const exprt &expr) const
653659

654660
return b0<=b1;
655661
}
656-
else if(expr.id()==ID_lt)
662+
else if(rel.id() == ID_lt)
657663
{
658664
r=is_lt(p);
659665
if(!r.is_unknown())
@@ -665,9 +671,9 @@ tvt invariant_sett::implies_rec(const exprt &expr) const
665671

666672
return b0<b1;
667673
}
668-
else if(expr.id()==ID_equal)
674+
else if(rel.id() == ID_equal)
669675
return is_eq(p);
670-
else if(expr.id()==ID_notequal)
676+
else if(rel.id() == ID_notequal)
671677
return is_ne(p);
672678
else
673679
UNREACHABLE;
@@ -717,10 +723,9 @@ void invariant_sett::nnf(exprt &expr, bool negate)
717723
}
718724
else if(expr.id()==ID_not)
719725
{
720-
assert(expr.operands().size()==1);
721-
nnf(expr.op0(), !negate);
726+
nnf(to_not_expr(expr).op(), !negate);
722727
exprt tmp;
723-
tmp.swap(expr.op0());
728+
tmp.swap(to_not_expr(expr).op());
724729
expr.swap(tmp);
725730
}
726731
else if(expr.id()==ID_and)
@@ -741,14 +746,15 @@ void invariant_sett::nnf(exprt &expr, bool negate)
741746
}
742747
else if(expr.id()==ID_typecast)
743748
{
744-
assert(expr.operands().size()==1);
749+
const auto &typecast_expr = to_typecast_expr(expr);
745750

746-
if(expr.op0().type().id()==ID_unsignedbv ||
747-
expr.op0().type().id()==ID_signedbv)
751+
if(
752+
typecast_expr.op().type().id() == ID_unsignedbv ||
753+
typecast_expr.op().type().id() == ID_signedbv)
748754
{
749755
equal_exprt tmp;
750-
tmp.lhs()=expr.op0();
751-
tmp.rhs()=from_integer(0, expr.op0().type());
756+
tmp.lhs() = typecast_expr.op();
757+
tmp.rhs() = from_integer(0, typecast_expr.op().type());
752758
nnf(tmp, !negate);
753759
expr.swap(tmp);
754760
}

0 commit comments

Comments
 (0)