Skip to content

Commit fa12ca7

Browse files
authored
Merge pull request #5880 from jezhiggins/vsd-value-sets-and-constants
VSD - Cross-representation expression evaluation
2 parents 6ad479d + 2fa8d96 commit fa12ca7

21 files changed

+2174
-985
lines changed

src/analyses/variable-sensitivity/abstract_object_set.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
\*******************************************************************/
88

99
#include <analyses/variable-sensitivity/abstract_object_set.h>
10+
#include <analyses/variable-sensitivity/interval_abstract_value.h>
11+
#include <util/interval.h>
1012
#include <util/string_utils.h>
1113

1214
static bool by_length(const std::string &lhs, const std::string &rhs)
@@ -34,3 +36,19 @@ void abstract_object_sett::output(
3436

3537
join_strings(out, output_values.begin(), output_values.end(), ", ");
3638
}
39+
40+
abstract_object_pointert abstract_object_sett::to_interval()
41+
{
42+
PRECONDITION(!values.empty());
43+
44+
exprt lower_expr = first()->to_constant();
45+
exprt upper_expr = first()->to_constant();
46+
for(const auto &value : values)
47+
{
48+
const auto &value_expr = value->to_constant();
49+
lower_expr = constant_interval_exprt::get_min(lower_expr, value_expr);
50+
upper_expr = constant_interval_exprt::get_max(upper_expr, value_expr);
51+
}
52+
return std::make_shared<interval_abstract_valuet>(
53+
constant_interval_exprt(lower_expr, upper_expr));
54+
}

src/analyses/variable-sensitivity/abstract_object_set.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class abstract_object_sett
3838
{
3939
values.insert(rhs.begin(), rhs.end());
4040
}
41+
void insert(const value_ranget &rhs)
42+
{
43+
for(auto const &value : rhs)
44+
insert(value);
45+
}
4146

4247
abstract_object_pointert first() const
4348
{
@@ -67,9 +72,19 @@ class abstract_object_sett
6772
return values == rhs.values;
6873
}
6974

75+
void clear()
76+
{
77+
values.clear();
78+
}
79+
7080
void
7181
output(std::ostream &out, const ai_baset &ai, const namespacet &ns) const;
7282

83+
/// Cast the set of values \p other_values to an interval.
84+
/// \param other_values: the value-set to be abstracted into an interval
85+
/// \return the interval-abstract-object containing \p other_values
86+
abstract_object_pointert to_interval();
87+
7388
private:
7489
value_sett values;
7590
};

0 commit comments

Comments
 (0)