summaryrefslogtreecommitdiff
path: root/src/passes/OptimizeInstructions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/OptimizeInstructions.cpp')
-rw-r--r--src/passes/OptimizeInstructions.cpp30
1 files changed, 13 insertions, 17 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index 2c4bdc905..22d53b151 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -275,7 +275,7 @@ struct OptimizeInstructions
}
EffectAnalyzer effects(Expression* expr) {
- return EffectAnalyzer(getPassOptions(), getModule()->features, expr);
+ return EffectAnalyzer(getPassOptions(), *getModule(), expr);
}
decltype(auto) pure(Expression** binder) {
@@ -284,8 +284,7 @@ struct OptimizeInstructions
}
bool canReorder(Expression* a, Expression* b) {
- return EffectAnalyzer::canReorder(
- getPassOptions(), getModule()->features, a, b);
+ return EffectAnalyzer::canReorder(getPassOptions(), *getModule(), a, b);
}
void visitBinary(Binary* curr) {
@@ -1379,7 +1378,8 @@ struct OptimizeInstructions
if (auto* child = ref->dynCast<RefCast>()) {
// Check if the casts are identical.
if (ExpressionAnalyzer::equal(curr->rtt, child->rtt) &&
- !EffectAnalyzer(passOptions, features, curr->rtt).hasSideEffects()) {
+ !EffectAnalyzer(passOptions, *getModule(), curr->rtt)
+ .hasSideEffects()) {
replaceCurrent(curr->ref);
return;
}
@@ -1545,9 +1545,9 @@ private:
// checking if we can remove the two inputs anyhow.)
auto passOptions = getPassOptions();
auto features = getModule()->features;
- if (EffectAnalyzer(passOptions, features, left)
+ if (EffectAnalyzer(passOptions, *getModule(), left)
.hasUnremovableSideEffects() ||
- EffectAnalyzer(passOptions, features, right)
+ EffectAnalyzer(passOptions, *getModule(), right)
.hasUnremovableSideEffects()) {
return false;
}
@@ -1916,7 +1916,6 @@ private:
if (!curr->type.isInteger()) {
return;
}
- FeatureSet features = getModule()->features;
auto type = curr->type;
auto* left = curr->left->dynCast<Const>();
auto* right = curr->right->dynCast<Const>();
@@ -1938,7 +1937,7 @@ private:
// shift has side effects
if (((left && left->value.isZero()) ||
(right && Bits::getEffectiveShifts(right) == 0)) &&
- !EffectAnalyzer(passOptions, features, curr->right)
+ !EffectAnalyzer(passOptions, *getModule(), curr->right)
.hasSideEffects()) {
replaceCurrent(curr->left);
return;
@@ -1947,13 +1946,13 @@ private:
// multiplying by zero is a zero, unless the other side has side
// effects
if (left && left->value.isZero() &&
- !EffectAnalyzer(passOptions, features, curr->right)
+ !EffectAnalyzer(passOptions, *getModule(), curr->right)
.hasSideEffects()) {
replaceCurrent(left);
return;
}
if (right && right->value.isZero() &&
- !EffectAnalyzer(passOptions, features, curr->left)
+ !EffectAnalyzer(passOptions, *getModule(), curr->left)
.hasSideEffects()) {
replaceCurrent(right);
return;
@@ -2687,8 +2686,7 @@ private:
if (type.isInteger()) {
if (auto* inner = outer->right->dynCast<Binary>()) {
if (outer->op == inner->op) {
- if (!EffectAnalyzer(
- getPassOptions(), getModule()->features, outer->left)
+ if (!EffectAnalyzer(getPassOptions(), *getModule(), outer->left)
.hasSideEffects()) {
if (ExpressionAnalyzer::equal(inner->left, outer->left)) {
// x - (x - y) ==> y
@@ -2730,8 +2728,7 @@ private:
}
if (auto* inner = outer->left->dynCast<Binary>()) {
if (outer->op == inner->op) {
- if (!EffectAnalyzer(
- getPassOptions(), getModule()->features, outer->right)
+ if (!EffectAnalyzer(getPassOptions(), *getModule(), outer->right)
.hasSideEffects()) {
if (ExpressionAnalyzer::equal(inner->right, outer->right)) {
// (x ^ y) ^ y ==> x
@@ -3263,9 +3260,8 @@ private:
// the side effects execute once, so there is no problem.
// TODO: handle certain side effects when possible in select
bool validEffects = std::is_same<T, If>::value ||
- !ShallowEffectAnalyzer(getPassOptions(),
- getModule()->features,
- curr->ifTrue)
+ !ShallowEffectAnalyzer(
+ getPassOptions(), *getModule(), curr->ifTrue)
.hasSideEffects();
// In addition, check for specific limitations of select.