Skip to content

Commit 5ecee62

Browse files
author
Owen Jones
committed
Replace objectt in value_set_fi.*
typedef optional<mp_integer> to offsett and use that instead of objectt. This reduces code and gets rid of an unintuitive class name.
1 parent 1a51d67 commit 5ecee62

File tree

2 files changed

+52
-69
lines changed

2 files changed

+52
-69
lines changed

src/pointer-analysis/value_set_fi.cpp

+31-37
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ void value_set_fit::output(
102102
{
103103
result="<"+from_expr(ns, identifier, o)+", ";
104104

105-
if(o_it->second.offset_is_set)
106-
result+=integer2string(o_it->second.offset)+"";
105+
if(o_it->second)
106+
result += integer2string(*o_it->second) + "";
107107
else
108108
result+='*';
109109

@@ -197,13 +197,12 @@ void value_set_fit::flatten_rec(
197197
t_it!=temp.write().end();
198198
t_it++)
199199
{
200-
if(t_it->second.offset_is_set &&
201-
it->second.offset_is_set)
200+
if(t_it->second && it->second)
202201
{
203-
t_it->second.offset += it->second.offset;
202+
*t_it->second += *it->second;
204203
}
205204
else
206-
t_it->second.offset_is_set=false;
205+
t_it->second.reset();
207206
}
208207

209208
forall_objects(oit, temp.read())
@@ -217,7 +216,7 @@ void value_set_fit::flatten_rec(
217216
if(generalize_index) // this means we had recursive symbols in there
218217
{
219218
Forall_objects(it, dest.write())
220-
it->second.offset_is_set = false;
219+
it->second.reset();
221220
}
222221

223222
seen.erase(identifier + e.suffix);
@@ -235,8 +234,8 @@ exprt value_set_fit::to_expr(const object_map_dt::value_type &it) const
235234

236235
od.object()=object;
237236

238-
if(it.second.offset_is_set)
239-
od.offset()=from_integer(it.second.offset, index_type());
237+
if(it.second)
238+
od.offset() = from_integer(*it.second, index_type());
240239

241240
od.type()=od.object().type();
242241

@@ -324,13 +323,12 @@ void value_set_fit::get_value_set(
324323
t_it!=temp.write().end();
325324
t_it++)
326325
{
327-
if(t_it->second.offset_is_set &&
328-
it->second.offset_is_set)
326+
if(t_it->second && it->second)
329327
{
330-
t_it->second.offset += it->second.offset;
328+
*t_it->second += *it->second;
331329
}
332330
else
333-
t_it->second.offset_is_set=false;
331+
t_it->second.reset();
334332

335333
flat_map.write()[t_it->first]=t_it->second;
336334
}
@@ -573,32 +571,31 @@ void value_set_fit::get_value_set_rec(
573571

574572
forall_objects(it, pointer_expr_set.read())
575573
{
576-
objectt object=it->second;
574+
offsett offset = it->second;
577575

578-
if(object.offset_is_zero() &&
579-
expr.operands().size()==2)
576+
if(offset_is_zero(offset) && expr.operands().size() == 2)
580577
{
581578
if(expr.op0().type().id()!=ID_pointer)
582579
{
583580
mp_integer i;
584581
if(to_integer(expr.op0(), i))
585-
object.offset_is_set=false;
582+
offset.reset();
586583
else
587-
object.offset=(expr.id()==ID_plus)? i : -i;
584+
*offset = (expr.id() == ID_plus) ? i : -i;
588585
}
589586
else
590587
{
591588
mp_integer i;
592589
if(to_integer(expr.op1(), i))
593-
object.offset_is_set=false;
590+
offset.reset();
594591
else
595-
object.offset=(expr.id()==ID_plus)? i : -i;
592+
*offset = (expr.id() == ID_plus) ? i : -i;
596593
}
597594
}
598595
else
599-
object.offset_is_set=false;
596+
offset.reset();
600597

601-
insert(dest, it->first, object);
598+
insert(dest, it->first, offset);
602599
}
603600

604601
return;
@@ -737,13 +734,12 @@ void value_set_fit::get_reference_set(
737734
t_it!=omt.write().end();
738735
t_it++)
739736
{
740-
if(t_it->second.offset_is_set &&
741-
it->second.offset_is_set)
737+
if(t_it->second && it->second)
742738
{
743-
t_it->second.offset += it->second.offset;
739+
*t_it->second += *it->second;
744740
}
745741
else
746-
t_it->second.offset_is_set=false;
742+
t_it->second.reset();
747743
}
748744

749745
forall_objects(it, omt.read())
@@ -826,13 +822,12 @@ void value_set_fit::get_reference_set_sharing_rec(
826822
t_it!=t2.write().end();
827823
t_it++)
828824
{
829-
if(t_it->second.offset_is_set &&
830-
it->second.offset_is_set)
825+
if(t_it->second && it->second)
831826
{
832-
t_it->second.offset += it->second.offset;
827+
*t_it->second += *it->second;
833828
}
834829
else
835-
t_it->second.offset_is_set=false;
830+
t_it->second.reset();
836831
}
837832

838833
forall_objects(it2, t2.read())
@@ -889,17 +884,16 @@ void value_set_fit::get_reference_set_sharing_rec(
889884
ns.follow(object.type())!=array_type)
890885
index_expr.make_typecast(array.type());
891886

892-
objectt o=a_it->second;
887+
offsett o = a_it->second;
893888
mp_integer i;
894889

895890
if(offset.is_zero())
896891
{
897892
}
898-
else if(!to_integer(offset, i) &&
899-
o.offset_is_zero())
900-
o.offset=i;
893+
else if(!to_integer(offset, i) && offset_is_zero(o))
894+
*o = i;
901895
else
902-
o.offset_is_set=false;
896+
o.reset();
903897

904898
insert(dest, index_expr, o);
905899
}
@@ -936,7 +930,7 @@ void value_set_fit::get_reference_set_sharing_rec(
936930
}
937931
else
938932
{
939-
objectt o=it->second;
933+
offsett o = it->second;
940934

941935
exprt member_expr(ID_member, expr.type());
942936
member_expr.copy_to_operands(object);
@@ -1189,7 +1183,7 @@ void value_set_fit::do_free(
11891183
else
11901184
{
11911185
// adjust
1192-
objectt o=o_it->second;
1186+
offsett o = o_it->second;
11931187
exprt tmp(object);
11941188
to_dynamic_object_expr(tmp).valid()=exprt(ID_unknown);
11951189
insert(new_object_map, tmp, o);

src/pointer-analysis/value_set_fi.h

+21-32
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,17 @@ class value_set_fit
5252

5353
typedef irep_idt idt;
5454

55-
class objectt
55+
/// Represents the offset into an object: either a unique integer offset,
56+
/// or an unknown value, represented by `!offset`.
57+
typedef optionalt<mp_integer> offsett;
58+
bool offset_is_zero(const offsett &offset) const
5659
{
57-
public:
58-
objectt():offset_is_set(false)
59-
{
60-
}
61-
62-
explicit objectt(const mp_integer &_offset):
63-
offset(_offset),
64-
offset_is_set(true)
65-
{
66-
}
67-
68-
mp_integer offset;
69-
bool offset_is_set;
70-
bool offset_is_zero() const
71-
{ return offset_is_set && offset.is_zero(); }
72-
};
60+
return offset && offset->is_zero();
61+
}
7362

7463
class object_map_dt
7564
{
76-
typedef std::map<object_numberingt::number_type, objectt> data_typet;
65+
typedef std::map<object_numberingt::number_type, offsett> data_typet;
7766
data_typet data;
7867

7968
public:
@@ -94,7 +83,7 @@ class value_set_fit
9483

9584
size_t size() const { return data.size(); }
9685

97-
objectt &operator[](object_numberingt::number_type i)
86+
offsett &operator[](object_numberingt::number_type i)
9887
{
9988
return data[i];
10089
}
@@ -127,55 +116,55 @@ class value_set_fit
127116

128117
bool insert(object_mapt &dest, const exprt &src) const
129118
{
130-
return insert(dest, object_numbering.number(src), objectt());
119+
return insert(dest, object_numbering.number(src), offsett());
131120
}
132121

133122
bool insert(
134123
object_mapt &dest,
135124
const exprt &src,
136-
const mp_integer &offset) const
125+
const mp_integer &offset_value) const
137126
{
138-
return insert(dest, object_numbering.number(src), objectt(offset));
127+
return insert(dest, object_numbering.number(src), offsett(offset_value));
139128
}
140129

141130
bool insert(
142131
object_mapt &dest,
143132
object_numberingt::number_type n,
144-
const objectt &object) const
133+
const offsett &offset) const
145134
{
146135
if(dest.read().find(n)==dest.read().end())
147136
{
148137
// new
149-
dest.write()[n]=object;
138+
dest.write()[n] = offset;
150139
return true;
151140
}
152141
else
153142
{
154-
objectt &old=dest.write()[n];
143+
offsett &old_offset = dest.write()[n];
155144

156-
if(old.offset_is_set && object.offset_is_set)
145+
if(old_offset && offset)
157146
{
158-
if(old.offset==object.offset)
147+
if(*old_offset == *offset)
159148
return false;
160149
else
161150
{
162-
old.offset_is_set=false;
151+
old_offset.reset();
163152
return true;
164153
}
165154
}
166-
else if(!old.offset_is_set)
155+
else if(!old_offset)
167156
return false;
168157
else
169158
{
170-
old.offset_is_set=false;
159+
old_offset.reset();
171160
return true;
172161
}
173162
}
174163
}
175164

176-
bool insert(object_mapt &dest, const exprt &expr, const objectt &object) const
165+
bool insert(object_mapt &dest, const exprt &expr, const offsett &offset) const
177166
{
178-
return insert(dest, object_numbering.number(expr), object);
167+
return insert(dest, object_numbering.number(expr), offset);
179168
}
180169

181170
struct entryt

0 commit comments

Comments
 (0)