diff options
Diffstat (limited to 'src/passes/MergeBlocks.cpp')
-rw-r--r-- | src/passes/MergeBlocks.cpp | 56 |
1 files changed, 0 insertions, 56 deletions
diff --git a/src/passes/MergeBlocks.cpp b/src/passes/MergeBlocks.cpp index 4999fd234..543c7f89c 100644 --- a/src/passes/MergeBlocks.cpp +++ b/src/passes/MergeBlocks.cpp @@ -335,62 +335,6 @@ struct MergeBlocks : public WalkerPass<PostWalker<MergeBlocks>> { Pass* create() override { return new MergeBlocks; } void visitBlock(Block *curr) { - // If the block has a single child which is a loop, and the block is named, - // then it is the exit for the loop. It's better to move it into the loop, - // where it can be better optimized by other passes. - // Similar logic for ifs: if the block is an exit for the if, we can - // move the block in, consider for example: - // (block $label - // (if (..condition1..) - // (block - // (br_if $label (..condition2..)) - // (..code..) - // ) - // ) - // ) - // After also merging the blocks, we have - // (if (..condition1..) - // (block $label - // (br_if $label (..condition2..)) - // (..code..) - // ) - // ) - // which can be further optimized by other passes. - if (curr->name.is() && curr->list.size() == 1) { - if (auto* loop = curr->list[0]->dynCast<Loop>()) { - curr->list[0] = loop->body; - loop->body = curr; - auto oldOuterType = curr->type; - curr->finalize(curr->type); - loop->finalize(); - // After the flip, the outer type must be the same - assert(loop->type == oldOuterType); - replaceCurrent(loop); - } else if (auto* iff = curr->list[0]->dynCast<If>()) { - // The label can't be used in the condition. - if (BranchUtils::BranchSeeker::countNamed(iff->condition, curr->name) == 0) { - // We can move the block into either arm, if there are no uses in the other. - Expression** target = nullptr; - if (!iff->ifFalse || - BranchUtils::BranchSeeker::countNamed(iff->ifFalse, curr->name) == 0) { - target = &iff->ifTrue; - } else if (BranchUtils::BranchSeeker::countNamed(iff->ifTrue, curr->name) == 0) { - target = &iff->ifFalse; - } - if (target) { - curr->list[0] = *target; - *target = curr; - curr->finalize(curr->type); - iff->finalize(); - replaceCurrent(iff); - // Note that the type might change, e.g. if the if condition is unreachable - // but the block that was on the outside had a break. - } - } - } - // Always fall through to optimize the block, which has a new child now. - } - // Otherwise, do the main merging optimizations. optimizeBlock(curr, getModule(), getPassOptions()); } |