diff options
Diffstat (limited to 'src/passes/MergeBlocks.cpp')
-rw-r--r-- | src/passes/MergeBlocks.cpp | 27 |
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); |