summaryrefslogtreecommitdiff
path: root/src/passes/MergeBlocks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/MergeBlocks.cpp')
-rw-r--r--src/passes/MergeBlocks.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp
index 276c50d9e..ab368429f 100644
--- a/src/passes/MergeBlocks.cpp
+++ b/src/passes/MergeBlocks.cpp
@@ -101,7 +101,8 @@ struct ProblemFinder : public ControlFlowWalker<ProblemFinder> {
brIfs++;
}
// if the value has side effects, we can't remove it
- if (EffectAnalyzer(passOptions, curr->value).hasSideEffects()) {
+ if (EffectAnalyzer(passOptions, getModule()->features, curr->value)
+ .hasSideEffects()) {
foundProblem = true;
}
}
@@ -224,6 +225,7 @@ optimizeBlock(Block* curr, Module* module, PassOptions& passOptions) {
Expression* expression = childBlock;
// check if it's ok to remove the value from all breaks to us
ProblemFinder finder(passOptions);
+ finder.setModule(module);
finder.origin = childBlock->name;
finder.walk(expression);
if (finder.found()) {
@@ -418,17 +420,18 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
if (!child) {
return outer;
}
+ FeatureSet features = getModule()->features;
if ((dependency1 && *dependency1) || (dependency2 && *dependency2)) {
// there are dependencies, things we must be reordered through. make sure
// no problems there
- EffectAnalyzer childEffects(getPassOptions(), child);
+ EffectAnalyzer childEffects(getPassOptions(), features, child);
if (dependency1 && *dependency1 &&
- EffectAnalyzer(getPassOptions(), *dependency1)
+ EffectAnalyzer(getPassOptions(), features, *dependency1)
.invalidates(childEffects)) {
return outer;
}
if (dependency2 && *dependency2 &&
- EffectAnalyzer(getPassOptions(), *dependency2)
+ EffectAnalyzer(getPassOptions(), features, *dependency2)
.invalidates(childEffects)) {
return outer;
}
@@ -495,16 +498,17 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
Expression*& third) {
// TODO: for now, just stop when we see any side effect. instead, we could
// check effects carefully for reordering
+ FeatureSet features = getModule()->features;
Block* outer = nullptr;
- if (EffectAnalyzer(getPassOptions(), first).hasSideEffects()) {
+ if (EffectAnalyzer(getPassOptions(), features, first).hasSideEffects()) {
return;
}
outer = optimize(curr, first, outer);
- if (EffectAnalyzer(getPassOptions(), second).hasSideEffects()) {
+ if (EffectAnalyzer(getPassOptions(), features, second).hasSideEffects()) {
return;
}
outer = optimize(curr, second, outer);
- if (EffectAnalyzer(getPassOptions(), third).hasSideEffects()) {
+ if (EffectAnalyzer(getPassOptions(), features, third).hasSideEffects()) {
return;
}
optimize(curr, third, outer);
@@ -529,7 +533,8 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
template<typename T> void handleCall(T* curr) {
Block* outer = nullptr;
for (Index i = 0; i < curr->operands.size(); i++) {
- if (EffectAnalyzer(getPassOptions(), curr->operands[i])
+ if (EffectAnalyzer(
+ getPassOptions(), getModule()->features, curr->operands[i])
.hasSideEffects()) {
return;
}
@@ -541,15 +546,17 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> {
void visitCall(Call* curr) { handleCall(curr); }
void visitCallIndirect(CallIndirect* curr) {
+ FeatureSet features = getModule()->features;
Block* outer = nullptr;
for (Index i = 0; i < curr->operands.size(); i++) {
- if (EffectAnalyzer(getPassOptions(), curr->operands[i])
+ if (EffectAnalyzer(getPassOptions(), features, curr->operands[i])
.hasSideEffects()) {
return;
}
outer = optimize(curr, curr->operands[i], outer);
}
- if (EffectAnalyzer(getPassOptions(), curr->target).hasSideEffects()) {
+ if (EffectAnalyzer(getPassOptions(), features, curr->target)
+ .hasSideEffects()) {
return;
}
optimize(curr, curr->target, outer);