Skip to content

Commit 6eb0042

Browse files
committed
Remove 'unknown' parameter from bv_get_rec
The entries in the vector are all guaranteed to be false. Thus, any branches depending on the value can be cleaned up, and the vector no longer needs to be passed around.
1 parent 323de35 commit 6eb0042

File tree

4 files changed

+31
-57
lines changed

4 files changed

+31
-57
lines changed

src/solvers/flattening/boolbv.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ class boolbvt:public arrayst
236236
virtual exprt bv_get_rec(
237237
const exprt &expr,
238238
const bvt &bv,
239-
const std::vector<bool> &unknown,
240239
std::size_t offset,
241240
const typet &type) const;
242241

src/solvers/flattening/boolbv_get.cpp

Lines changed: 24 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,7 @@ exprt boolbvt::get(const exprt &expr) const
3535
// the mapping
3636
PRECONDITION(expr.type() == typet() || expr.type() == map_entry.type);
3737

38-
std::vector<bool> unknown =
39-
std::vector<bool>(map_entry.literal_map.size(), false);
40-
41-
return bv_get_rec(
42-
expr, map_entry.literal_map, unknown, 0, map_entry.type);
38+
return bv_get_rec(expr, map_entry.literal_map, 0, map_entry.type);
4339
}
4440
}
4541

@@ -49,30 +45,23 @@ exprt boolbvt::get(const exprt &expr) const
4945
exprt boolbvt::bv_get_rec(
5046
const exprt &expr,
5147
const bvt &bv,
52-
const std::vector<bool> &unknown,
5348
std::size_t offset,
5449
const typet &type) const
5550
{
5651
std::size_t width=boolbv_width(type);
5752

58-
assert(bv.size()==unknown.size());
5953
assert(bv.size()>=offset+width);
6054

6155
if(type.id()==ID_bool)
6256
{
63-
if(!unknown[offset])
57+
// clang-format off
58+
switch(prop.l_get(bv[offset]).get_value())
6459
{
65-
// clang-format off
66-
switch(prop.l_get(bv[offset]).get_value())
67-
{
68-
case tvt::tv_enumt::TV_FALSE: return false_exprt();
69-
case tvt::tv_enumt::TV_TRUE: return true_exprt();
70-
case tvt::tv_enumt::TV_UNKNOWN: return false_exprt(); // default
71-
}
72-
// clang-format on
60+
case tvt::tv_enumt::TV_FALSE: return false_exprt();
61+
case tvt::tv_enumt::TV_TRUE: return true_exprt();
62+
case tvt::tv_enumt::TV_UNKNOWN: return false_exprt(); // default
7363
}
74-
75-
return false_exprt{}; // default
64+
// clang-format on
7665
}
7766

7867
bvtypet bvtype=get_bvtype(type);
@@ -98,8 +87,7 @@ exprt boolbvt::bv_get_rec(
9887
{
9988
const index_exprt index{
10089
expr, from_integer(new_offset / sub_width, index_type())};
101-
op.push_back(
102-
bv_get_rec(index, bv, unknown, offset + new_offset, subtype));
90+
op.push_back(bv_get_rec(index, bv, offset + new_offset, subtype));
10391
}
10492

10593
exprt dest=exprt(ID_array, type);
@@ -113,15 +101,15 @@ exprt boolbvt::bv_get_rec(
113101
}
114102
else if(type.id()==ID_struct_tag)
115103
{
116-
exprt result = bv_get_rec(
117-
expr, bv, unknown, offset, ns.follow_tag(to_struct_tag_type(type)));
104+
exprt result =
105+
bv_get_rec(expr, bv, offset, ns.follow_tag(to_struct_tag_type(type)));
118106
result.type() = type;
119107
return result;
120108
}
121109
else if(type.id()==ID_union_tag)
122110
{
123-
exprt result = bv_get_rec(
124-
expr, bv, unknown, offset, ns.follow_tag(to_union_tag_type(type)));
111+
exprt result =
112+
bv_get_rec(expr, bv, offset, ns.follow_tag(to_union_tag_type(type)));
125113
result.type() = type;
126114
return result;
127115
}
@@ -138,8 +126,7 @@ exprt boolbvt::bv_get_rec(
138126
const typet &subtype = c.type();
139127

140128
const member_exprt member{expr, c.get_name(), subtype};
141-
op.push_back(
142-
bv_get_rec(member, bv, unknown, offset + new_offset, subtype));
129+
op.push_back(bv_get_rec(member, bv, offset + new_offset, subtype));
143130

144131
std::size_t sub_width = boolbv_width(subtype);
145132
if(sub_width!=0)
@@ -164,7 +151,7 @@ exprt boolbvt::bv_get_rec(
164151
expr, components[component_nr].get_name(), subtype};
165152
return union_exprt(
166153
components[component_nr].get_name(),
167-
bv_get_rec(member, bv, unknown, offset, subtype),
154+
bv_get_rec(member, bv, offset, subtype),
168155
union_type);
169156
}
170157
else if(type.id()==ID_vector)
@@ -182,7 +169,7 @@ exprt boolbvt::bv_get_rec(
182169
{
183170
const index_exprt index{expr, from_integer(i, index_type())};
184171
value.operands().push_back(
185-
bv_get_rec(index, bv, unknown, i * sub_width, subtype));
172+
bv_get_rec(index, bv, i * sub_width, subtype));
186173
}
187174

188175
return std::move(value);
@@ -196,10 +183,8 @@ exprt boolbvt::bv_get_rec(
196183
if(sub_width!=0 && width==sub_width*2)
197184
{
198185
const complex_exprt value(
199-
bv_get_rec(
200-
complex_real_exprt{expr}, bv, unknown, 0 * sub_width, subtype),
201-
bv_get_rec(
202-
complex_imag_exprt{expr}, bv, unknown, 1 * sub_width, subtype),
186+
bv_get_rec(complex_real_exprt{expr}, bv, 0 * sub_width, subtype),
187+
bv_get_rec(complex_imag_exprt{expr}, bv, 1 * sub_width, subtype),
203188
to_complex_type(type));
204189

205190
return value;
@@ -213,16 +198,14 @@ exprt boolbvt::bv_get_rec(
213198
for(std::size_t bit_nr=offset; bit_nr<offset+width; bit_nr++)
214199
{
215200
char ch = '0';
216-
if(!unknown[bit_nr])
201+
// clang-format off
202+
switch(prop.l_get(bv[bit_nr]).get_value())
217203
{
218-
switch(prop.l_get(bv[bit_nr]).get_value())
219-
{
220-
case tvt::tv_enumt::TV_FALSE: ch='0'; break;
221-
case tvt::tv_enumt::TV_TRUE: ch='1'; break;
222-
case tvt::tv_enumt::TV_UNKNOWN: ch='0'; break;
223-
default: UNREACHABLE;
224-
}
204+
case tvt::tv_enumt::TV_FALSE: ch = '0'; break;
205+
case tvt::tv_enumt::TV_TRUE: ch = '1'; break;
206+
case tvt::tv_enumt::TV_UNKNOWN: ch = '0'; break;
225207
}
208+
// clang-format on
226209

227210
value=ch+value;
228211
}
@@ -279,9 +262,7 @@ exprt boolbvt::bv_get_rec(
279262

280263
exprt boolbvt::bv_get(const bvt &bv, const typet &type) const
281264
{
282-
std::vector<bool> unknown;
283-
unknown.resize(bv.size(), false);
284-
return bv_get_rec(nil_exprt{}, bv, unknown, 0, type);
265+
return bv_get_rec(nil_exprt{}, bv, 0, type);
285266
}
286267

287268
exprt boolbvt::bv_get_cache(const exprt &expr) const

src/solvers/flattening/bv_pointers.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -593,12 +593,11 @@ bvt bv_pointerst::convert_bitvector(const exprt &expr)
593593
exprt bv_pointerst::bv_get_rec(
594594
const exprt &expr,
595595
const bvt &bv,
596-
const std::vector<bool> &unknown,
597596
std::size_t offset,
598597
const typet &type) const
599598
{
600599
if(type.id()!=ID_pointer)
601-
return SUB::bv_get_rec(expr, bv, unknown, offset, type);
600+
return SUB::bv_get_rec(expr, bv, offset, type);
602601

603602
std::string value_addr, value_offset, value;
604603

@@ -607,18 +606,14 @@ exprt bv_pointerst::bv_get_rec(
607606
char ch=0;
608607
std::size_t bit_nr=i+offset;
609608

610-
if(unknown[bit_nr])
611-
ch='0';
612-
else
609+
// clang-format off
610+
switch(prop.l_get(bv[bit_nr]).get_value())
613611
{
614-
switch(prop.l_get(bv[bit_nr]).get_value())
615-
{
616-
case tvt::tv_enumt::TV_FALSE: ch='0'; break;
617-
case tvt::tv_enumt::TV_TRUE: ch='1'; break;
618-
case tvt::tv_enumt::TV_UNKNOWN: ch='0'; break;
619-
default: UNREACHABLE;
620-
}
612+
case tvt::tv_enumt::TV_FALSE: ch = '0'; break;
613+
case tvt::tv_enumt::TV_TRUE: ch = '1'; break;
614+
case tvt::tv_enumt::TV_UNKNOWN: ch = '0'; break;
621615
}
616+
// clang-format on
622617

623618
value=ch+value;
624619

src/solvers/flattening/bv_pointers.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class bv_pointerst:public boolbvt
4646
exprt bv_get_rec(
4747
const exprt &expr,
4848
const bvt &bv,
49-
const std::vector<bool> &unknown,
5049
std::size_t offset,
5150
const typet &type) const override;
5251

0 commit comments

Comments
 (0)