Skip to content

Commit 12aa1b4

Browse files
author
Owen Jones
committed
Use strong writes on precise EVSs except for arrays
Previously writes were weak in some places (applying function summaries) and strong in others (assign_rec when there wasn't already an entry in the domain).
1 parent 54a3a1b commit 12aa1b4

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

src/pointer-analysis/external_value_set_expr.h

+11
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,17 @@ class external_value_set_exprt:public exprt
295295
}
296296
}
297297

298+
bool can_make_strong_write_to_precise_external_value_set() const
299+
{
300+
PRECONDITION(
301+
get_external_value_set_type() == external_value_set_typet::PRECISE);
302+
for(const auto &entry : access_path_entries())
303+
if(entry.label() == "[]")
304+
return false;
305+
306+
return true;
307+
}
308+
298309
static const typet &get_precise_evs_irep_id()
299310
{
300311
static typet precise_evs("precise_evs");

src/pointer-analysis/local_value_set.cpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,23 @@ void local_value_sett::assign_rec(
625625

626626
auto &lhs_entry=insert_result.first->second;
627627

628-
make_union(lhs_entry.object_map, values_rhs);
628+
const bool weak_write =
629+
add_to_sets ||
630+
!new_ext_set.can_make_strong_write_to_precise_external_value_set();
631+
632+
if(weak_write)
633+
{
634+
/// If we are doing a weak write, but this precise EVS did not
635+
/// already exist in the domain, we also put a copy of the precise
636+
/// EVS with is_initializer set to true in its value-set to
637+
/// represent that it might have its original value
638+
if(insert_result.second)
639+
insert(lhs_entry.object_map, new_ext_set.as_initializer());
640+
641+
make_union(lhs_entry.object_map, values_rhs);
642+
}
643+
else
644+
lhs_entry.object_map = values_rhs;
629645
}
630646
}
631647
}

src/pointer-analysis/local_value_set_analysis.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -445,10 +445,10 @@ void local_value_set_analysist::transform_function_stub(
445445
}
446446
else if(has_prefix(lhs_fieldname.base_name, precise_evs_prefix))
447447
{
448+
const external_value_set_exprt &precise_evs =
449+
to_external_value_set(lhs_fieldname.structured_lhs);
448450
const external_value_set_exprt::access_path_entriest
449-
&access_path_entries =
450-
to_external_value_set(lhs_fieldname.structured_lhs)
451-
.access_path_entries();
451+
&access_path_entries = precise_evs.access_path_entries();
452452
const exprt precise_access_path_expr = get_expr_from_root_object(
453453
lhs_fieldname.base_name.substr(precise_evs_prefix.size()),
454454
access_path_entries,
@@ -457,8 +457,14 @@ void local_value_set_analysist::transform_function_stub(
457457
ns,
458458
*this);
459459

460-
/// Weak write - can we do strong writes?
461-
bool add_to_sets=true;
460+
std::string objkey = lhs_fieldname.base_name + lhs_fieldname.field_name;
461+
auto it = valuesets.values.find(objkey);
462+
const bool singular = it == valuesets.values.end() ||
463+
it->second.object_map.read().size() == 1;
464+
bool add_to_sets =
465+
!singular ||
466+
!precise_evs.can_make_strong_write_to_precise_external_value_set();
467+
462468
auto demoted_rhs_values=pre_call_rhs_value_sets.at(assignment.second);
463469
valuesets.demote_initializers(demoted_rhs_values);
464470
valuesets.assign_valueset(

0 commit comments

Comments
 (0)