diff --git a/mlir/lib/Transforms/Utils/RegionUtils.cpp b/mlir/lib/Transforms/Utils/RegionUtils.cpp index a1d975dfb1476..31ae1d1895b81 100644 --- a/mlir/lib/Transforms/Utils/RegionUtils.cpp +++ b/mlir/lib/Transforms/Utils/RegionUtils.cpp @@ -23,12 +23,15 @@ #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/Support/DebugLog.h" #include #include using namespace mlir; +#define DEBUG_TYPE "region-utils" + void mlir::replaceAllUsesInRegionWith(Value orig, Value replacement, Region ®ion) { for (auto &use : llvm::make_early_inc_range(orig.getUses())) { @@ -182,19 +185,34 @@ SmallVector mlir::makeRegionIsolatedFromAbove( // TODO: We could likely merge this with the DCE algorithm below. LogicalResult mlir::eraseUnreachableBlocks(RewriterBase &rewriter, MutableArrayRef regions) { + LDBG() << "Starting eraseUnreachableBlocks with " << regions.size() + << " regions"; + // Set of blocks found to be reachable within a given region. llvm::df_iterator_default_set reachable; // If any blocks were found to be dead. - bool erasedDeadBlocks = false; + int erasedDeadBlocks = 0; SmallVector worklist; worklist.reserve(regions.size()); for (Region ®ion : regions) worklist.push_back(®ion); + + LDBG(2) << "Initial worklist size: " << worklist.size(); + while (!worklist.empty()) { Region *region = worklist.pop_back_val(); - if (region->empty()) + if (region->empty()) { + LDBG(2) << "Skipping empty region"; continue; + } + + LDBG(2) << "Processing region with " << region->getBlocks().size() + << " blocks"; + if (region->getParentOp()) + LDBG(2) << " -> for operation: " + << OpWithFlags(region->getParentOp(), + OpPrintingFlags().skipRegions()); // If this is a single block region, just collect the nested regions. if (region->hasOneBlock()) { @@ -209,13 +227,17 @@ LogicalResult mlir::eraseUnreachableBlocks(RewriterBase &rewriter, for (Block *block : depth_first_ext(®ion->front(), reachable)) (void)block /* Mark all reachable blocks */; + LDBG(2) << "Found " << reachable.size() << " reachable blocks out of " + << region->getBlocks().size() << " total blocks"; + // Collect all of the dead blocks and push the live regions onto the // worklist. for (Block &block : llvm::make_early_inc_range(*region)) { if (!reachable.count(&block)) { + LDBG() << "Erasing unreachable block: " << █ block.dropAllDefinedValueUses(); rewriter.eraseBlock(&block); - erasedDeadBlocks = true; + ++erasedDeadBlocks; continue; } @@ -226,7 +248,10 @@ LogicalResult mlir::eraseUnreachableBlocks(RewriterBase &rewriter, } } - return success(erasedDeadBlocks); + LDBG() << "Finished eraseUnreachableBlocks, erased " << erasedDeadBlocks + << " dead blocks"; + + return success(erasedDeadBlocks > 0); } //===----------------------------------------------------------------------===//