Skip to content

Commit 1e08227

Browse files
committed
[fix] Filter objects and values in changeVersion
1 parent 6569119 commit 1e08227

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

include/klee/Expr/AlphaBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class AlphaBuilder final : public ExprVisitor {
3434
public:
3535
AlphaBuilder(ArrayCache &_arrayCache);
3636
constraints_ty visitConstraints(constraints_ty cs);
37-
ref<Expr> visitExpr(ref<Expr> v);
37+
ref<Expr> build(ref<Expr> v);
3838
};
3939

4040
} // namespace klee

lib/Expr/AlphaBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ constraints_ty AlphaBuilder::visitConstraints(constraints_ty cs) {
7575
}
7676
return result;
7777
}
78-
ref<Expr> AlphaBuilder::visitExpr(ref<Expr> v) {
78+
ref<Expr> AlphaBuilder::build(ref<Expr> v) {
7979
ref<Expr> e = visit(v);
8080
reverseExprMap[e] = v;
8181
reverseExprMap[Expr::createIsZero(e)] = Expr::createIsZero(v);

lib/Solver/AlphaEquivalenceSolver.cpp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,14 @@ class AlphaEquivalenceSolver : public SolverImpl {
5555
void notifyStateTermination(std::uint32_t id);
5656
ValidityCore changeVersion(const ValidityCore &validityCore,
5757
const ExprHashMap<ref<Expr>> &reverse);
58-
const std::vector<const Array *>
58+
std::vector<const Array *>
5959
changeVersion(const std::vector<const Array *> &objects,
6060
const ArrayCache::ArrayHashMap<const Array *> &reverse);
6161
Assignment
62+
changeVersion(const std::vector<const Array *> &objects,
63+
const std::vector<SparseStorage<unsigned char>> &values,
64+
const ArrayCache::ArrayHashMap<const Array *> &reverse);
65+
Assignment
6266
changeVersion(const Assignment &a,
6367
const ArrayCache::ArrayHashMap<const Array *> &reverse);
6468
ref<SolverResponse> changeVersion(ref<SolverResponse> res,
@@ -80,12 +84,29 @@ AlphaEquivalenceSolver::changeVersion(const ValidityCore &validityCore,
8084
return reverseValidityCore;
8185
}
8286

83-
const std::vector<const Array *> AlphaEquivalenceSolver::changeVersion(
87+
Assignment AlphaEquivalenceSolver::changeVersion(
88+
const std::vector<const Array *> &objects,
89+
const std::vector<SparseStorage<unsigned char>> &values,
90+
const ArrayCache::ArrayHashMap<const Array *> &reverse) {
91+
std::vector<const Array *> reverseObjects;
92+
std::vector<SparseStorage<unsigned char>> reverseValues;
93+
for (size_t i = 0; i < objects.size(); i++) {
94+
if (reverse.count(objects.at(i)) != 0) {
95+
reverseObjects.push_back(reverse.at(objects.at(i)));
96+
reverseValues.push_back(values.at(i));
97+
}
98+
}
99+
return Assignment(reverseObjects, reverseValues);
100+
}
101+
102+
std::vector<const Array *> AlphaEquivalenceSolver::changeVersion(
84103
const std::vector<const Array *> &objects,
85104
const ArrayCache::ArrayHashMap<const Array *> &reverse) {
86105
std::vector<const Array *> reverseObjects;
87-
for (auto it : objects) {
88-
reverseObjects.push_back(reverse.at(it));
106+
for (size_t i = 0; i < objects.size(); i++) {
107+
if (reverse.count(objects.at(i)) != 0) {
108+
reverseObjects.push_back(reverse.at(objects.at(i)));
109+
}
89110
}
90111
return reverseObjects;
91112
}
@@ -95,8 +116,7 @@ Assignment AlphaEquivalenceSolver::changeVersion(
95116
const ArrayCache::ArrayHashMap<const Array *> &reverse) {
96117
std::vector<const Array *> objects = a.keys();
97118
std::vector<SparseStorage<unsigned char>> values = a.values();
98-
objects = changeVersion(objects, reverse);
99-
return Assignment(objects, values);
119+
return changeVersion(objects, values, reverse);
100120
}
101121

102122
ref<SolverResponse>
@@ -136,7 +156,7 @@ bool AlphaEquivalenceSolver::computeValidity(const Query &query,
136156
PartialValidity &result) {
137157
AlphaBuilder builder(arrayCache);
138158
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
139-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
159+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
140160
return solver->impl->computeValidity(
141161
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
142162
result);
@@ -145,7 +165,7 @@ bool AlphaEquivalenceSolver::computeValidity(const Query &query,
145165
bool AlphaEquivalenceSolver::computeTruth(const Query &query, bool &isValid) {
146166
AlphaBuilder builder(arrayCache);
147167
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
148-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
168+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
149169
return solver->impl->computeTruth(
150170
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
151171
isValid);
@@ -155,7 +175,7 @@ bool AlphaEquivalenceSolver::computeValue(const Query &query,
155175
ref<Expr> &result) {
156176
AlphaBuilder builder(arrayCache);
157177
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
158-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
178+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
159179
return solver->impl->computeValue(
160180
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
161181
result);
@@ -166,7 +186,7 @@ bool AlphaEquivalenceSolver::computeInitialValues(
166186
std::vector<SparseStorage<unsigned char>> &values, bool &hasSolution) {
167187
AlphaBuilder builder(arrayCache);
168188
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
169-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
189+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
170190
const std::vector<const Array *> newObjects =
171191
changeVersion(objects, builder.alphaArrayMap);
172192

@@ -183,7 +203,7 @@ bool AlphaEquivalenceSolver::check(const Query &query,
183203
AlphaBuilder builder(arrayCache);
184204

185205
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
186-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
206+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
187207
result = createAlphaVersion(result, builder);
188208
if (!solver->impl->check(
189209
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
@@ -201,7 +221,7 @@ bool AlphaEquivalenceSolver::computeValidityCore(const Query &query,
201221
AlphaBuilder builder(arrayCache);
202222

203223
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
204-
ref<Expr> alphaQueryExpr = builder.visitExpr(query.expr);
224+
ref<Expr> alphaQueryExpr = builder.build(query.expr);
205225
if (!solver->impl->computeValidityCore(
206226
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
207227
validityCore, isValid)) {

0 commit comments

Comments
 (0)