Skip to content

Commit 3fae575

Browse files
committed
[fix] Rebuild constraint dsu after constraints simplification
1 parent 847ed62 commit 3fae575

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

include/klee/Expr/Constraints.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ class Simplificator {
152152
struct SetResult {
153153
constraints_ty simplified;
154154
ExprHashMap<ExprHashSet> dependency;
155+
bool wasSimplified;
155156
};
156157

157158
public:

lib/Core/CXXTypeSystem/CXXTypeManager.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,10 @@ static ref<Expr> getComplexPointerRestrictions(
201201
restrictions.addConstraint(innerAlignmentRequirement, {});
202202
}
203203

204-
auto simplified = Simplificator::simplify(restrictions.cs()).simplified;
205-
restrictions.changeCS(simplified);
204+
auto simplified = Simplificator::simplify(restrictions.cs());
205+
if (simplified.wasSimplified) {
206+
restrictions.changeCS(simplified.simplified);
207+
}
206208
for (auto restriction : restrictions.cs()) {
207209
if (resultCondition.isNull()) {
208210
resultCondition = restriction;

lib/Expr/Constraints.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "klee/Expr/ExprHashMap.h"
1616
#include "klee/Expr/ExprUtil.h"
1717
#include "klee/Expr/ExprVisitor.h"
18+
#include "klee/Expr/IndependentSet.h"
1819
#include "klee/Expr/Path.h"
1920
#include "klee/Expr/Symcrete.h"
2021
#include "klee/Module/KModule.h"
@@ -289,7 +290,11 @@ void ConstraintSet::print(llvm::raw_ostream &os) const {
289290

290291
void ConstraintSet::dump() const { this->print(llvm::errs()); }
291292

292-
void ConstraintSet::changeCS(constraints_ty &cs) { _constraints = cs; }
293+
void ConstraintSet::changeCS(constraints_ty &cs) {
294+
_constraints = cs;
295+
_independentElements =
296+
IndependentConstraintSetUnion(_constraints, _symcretes, _concretization);
297+
}
293298

294299
const constraints_ty &ConstraintSet::cs() const { return _constraints; }
295300

@@ -355,10 +360,12 @@ ExprHashSet PathConstraints::addConstraint(ref<Expr> e, const Assignment &delta,
355360
if (RewriteEqualities != RewriteEqualitiesPolicy::None) {
356361
auto simplified =
357362
Simplificator::simplify(constraints.cs(), RewriteEqualities);
358-
constraints.changeCS(simplified.simplified);
363+
if (simplified.wasSimplified) {
364+
constraints.changeCS(simplified.simplified);
359365

360-
_simplificationMap = Simplificator::composeExprDependencies(
361-
_simplificationMap, simplified.dependency);
366+
_simplificationMap = Simplificator::composeExprDependencies(
367+
_simplificationMap, simplified.dependency);
368+
}
362369
}
363370

364371
return added;
@@ -463,6 +470,7 @@ Simplificator::simplify(const constraints_ty &constraints,
463470
dependencies.insert({constraint, {constraint}});
464471
}
465472

473+
bool actuallyChanged = false;
466474
bool changed = true;
467475
while (changed) {
468476
changed = false;
@@ -495,6 +503,7 @@ Simplificator::simplify(const constraints_ty &constraints,
495503
currentDependencies[part].insert(constraint);
496504
}
497505
if (constraint != simplifiedConstraint || andsSplit.size() > 1) {
506+
actuallyChanged = true;
498507
changed = true;
499508
}
500509
}
@@ -508,7 +517,7 @@ Simplificator::simplify(const constraints_ty &constraints,
508517
simplified.erase(ConstantExpr::createTrue());
509518
dependencies.erase(ConstantExpr::createTrue());
510519

511-
return {simplified, dependencies};
520+
return {simplified, dependencies, actuallyChanged};
512521
}
513522

514523
Simplificator::Replacements

0 commit comments

Comments
 (0)