Skip to content

Commit 6dc16bb

Browse files
author
Owen Jones
committed
Don't create unneeded entries for precise EVSs
Previously we would create an entry with the precise EVS on the left and also on the right, which mirrors what we do for per field EVSs. Now we only make an entry for a precise EVS if something is actually written to it.
1 parent c9f7c3f commit 6dc16bb

File tree

2 files changed

+33
-18
lines changed

2 files changed

+33
-18
lines changed

src/pointer-analysis/local_value_set.cpp

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,10 @@ void local_value_sett::make_union_adjusting_evs_types(
4141
}
4242

4343
std::pair<value_sett::valuest::iterator, bool>
44-
local_value_sett::init_external_value_set(const external_value_set_exprt &evse)
44+
local_value_sett::init_per_field_external_value_set(
45+
const external_value_set_exprt &evse)
4546
{
4647
PRECONDITION(!evse.access_path_entries().empty());
47-
bool per_field_evs =
48-
evse.get_external_value_set_type() == external_value_set_typet::PER_FIELD;
4948
const auto &apback=evse.access_path_entries().back();
5049
std::string basename=evse.get_access_path_basename(apback.declared_on_type());
5150
std::string access_path_suffix=evse.get_access_path_suffix();
@@ -56,15 +55,30 @@ local_value_sett::init_external_value_set(const external_value_set_exprt &evse)
5655
auto insert_result=values.insert(std::make_pair(irep_idt(entryname), entry));
5756

5857
if(insert_result.second)
59-
{
60-
const external_value_set_exprt &evs_to_insert =
61-
per_field_evs ? evse.as_initializer() : evse;
62-
insert(insert_result.first->second.object_map, evs_to_insert);
63-
}
58+
insert(insert_result.first->second.object_map, evse.as_initializer());
6459

6560
return insert_result;
6661
}
6762

63+
void local_value_sett::init_precise_external_value_set(
64+
const external_value_set_exprt &evse,
65+
object_mapt &dest)
66+
{
67+
PRECONDITION(!evse.access_path_entries().empty());
68+
const auto &apback = evse.access_path_entries().back();
69+
std::string basename =
70+
evse.get_access_path_basename(apback.declared_on_type());
71+
std::string access_path_suffix = evse.get_access_path_suffix();
72+
std::string entryname = basename + access_path_suffix;
73+
74+
const irep_idt key(entryname);
75+
76+
if(values.count(key))
77+
make_union(dest, values.at(key).object_map);
78+
else
79+
insert(dest, evse);
80+
}
81+
6882
/// Builds a version of expr suitable for alias-comparison
6983
/// \param expr: The expression to be converted to the alias-uniform structure
7084
/// \return expr without information which is irrelevant to alias-comparison
@@ -290,9 +304,8 @@ void local_value_sett::get_value_set_rec(
290304

291305
// TODO: figure out how to do this sort of on-demand-insert
292306
// without such ugly const hacking:
293-
auto insert_result=
294-
(const_cast<local_value_sett *>(this))->
295-
init_external_value_set(new_ext_set);
307+
auto insert_result = (const_cast<local_value_sett *>(this))
308+
->init_per_field_external_value_set(new_ext_set);
296309

297310
make_union(dest, insert_result.first->second.object_map);
298311
}
@@ -317,11 +330,8 @@ void local_value_sett::get_value_set_rec(
317330

318331
// TODO: figure out how to do this sort of on-demand-insert
319332
// without such ugly const hacking:
320-
auto insert_result=
321-
(const_cast<local_value_sett *>(this))->
322-
init_external_value_set(new_ext_set);
323-
324-
make_union(dest, insert_result.first->second.object_map);
333+
(const_cast<local_value_sett *>(this))
334+
->init_precise_external_value_set(new_ext_set, dest);
325335
}
326336
}
327337
}

src/pointer-analysis/local_value_set.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ class local_value_sett:public value_sett
5858
/// \param evse: external value set whose entry to create
5959
/// \return a la `std::map::insert`, a pair of an iterator pointing to the
6060
/// relevant entry and a boolean indicating if it is new.
61-
std::pair<valuest::iterator, bool> init_external_value_set(
62-
const external_value_set_exprt& evse);
61+
std::pair<valuest::iterator, bool>
62+
init_per_field_external_value_set(const external_value_set_exprt &evse);
63+
64+
/// TODO
65+
void init_precise_external_value_set(
66+
const external_value_set_exprt &evse,
67+
object_mapt &dest);
6368

6469
// For all the overrides below, see the base type for parameter-level docs
6570
// as their meanings are unchanged.

0 commit comments

Comments
 (0)