summaryrefslogtreecommitdiff
path: root/src/passes/LocalCSE.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/LocalCSE.cpp')
-rw-r--r--src/passes/LocalCSE.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/passes/LocalCSE.cpp b/src/passes/LocalCSE.cpp
index b49c92310..f7c1cda26 100644
--- a/src/passes/LocalCSE.cpp
+++ b/src/passes/LocalCSE.cpp
@@ -60,8 +60,11 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
Index index; // the local we are assigned to, local.get that to reuse us
EffectAnalyzer effects;
- UsableInfo(Expression* value, Index index, PassOptions& passOptions)
- : value(value), index(index), effects(passOptions, value) {}
+ UsableInfo(Expression* value,
+ Index index,
+ PassOptions& passOptions,
+ FeatureSet features)
+ : value(value), index(index), effects(passOptions, features, value) {}
};
// a list of usables in a linear execution trace
@@ -136,7 +139,7 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
// pre operations
Expression* curr = *currp;
- EffectAnalyzer effects(self->getPassOptions());
+ EffectAnalyzer effects(self->getPassOptions(), self->getModule()->features);
if (effects.checkPre(curr)) {
self->checkInvalidations(effects);
}
@@ -152,7 +155,7 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
// post operations
- EffectAnalyzer effects(self->getPassOptions());
+ EffectAnalyzer effects(self->getPassOptions(), self->getModule()->features);
if (effects.checkPost(curr)) {
self->checkInvalidations(effects, curr);
}
@@ -194,7 +197,9 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
} else {
// not in table, add this, maybe we can help others later
usables.emplace(std::make_pair(
- hashed, UsableInfo(value, set->index, getPassOptions())));
+ hashed,
+ UsableInfo(
+ value, set->index, getPassOptions(), getModule()->features)));
}
}
} else if (auto* get = curr->dynCast<LocalGet>()) {
@@ -215,7 +220,8 @@ struct LocalCSE : public WalkerPass<LinearExecutionWalker<LocalCSE>> {
if (!value->type.isConcrete()) {
return false; // don't bother with unreachable etc.
}
- if (EffectAnalyzer(getPassOptions(), value).hasSideEffects()) {
+ if (EffectAnalyzer(getPassOptions(), getModule()->features, value)
+ .hasSideEffects()) {
return false; // we can't combine things with side effects
}
auto& options = getPassRunner()->options;