[Mlir-commits] [mlir] Reland "[mlir][reducer] Add eraseRedundantBlocksInRegion to reduction-tree pass" (PR #191961)
Jacques Pienaar
llvmlistbot at llvm.org
Mon Jun 1 01:25:12 PDT 2026
================
@@ -182,24 +189,207 @@ static LogicalResult eraseAllOpsInRegion(ModuleOp module, Region ®ion,
return failure();
}
+/// Searches for an unvisited branch terminator within the given region based on
+/// the specified conditionality. This helper scans blocks in the \p region to
+/// find a terminator that has not yet been processed (not in \p visited). If
+/// \p isConditional is true, it looks for terminators with multiple successors
+/// (e.g., cf.cond_br). Otherwise, it looks for single-successor terminators
+/// (e.g., cf.br).
+static Operation *getBranchTerminatorInRegion(Region ®ion,
+ DenseSet<Operation *> &visited,
+ bool isConditional = true) {
+ auto it = llvm::find_if(region.getBlocks(), [&](Block &block) {
+ if (!block.mightHaveTerminator())
+ return false;
+ size_t numSucc = block.getNumSuccessors();
+ Operation *term = block.getTerminator();
+ return !visited.contains(term) &&
+ (isConditional ? numSucc > 1 : numSucc == 1);
+ });
+ return it != region.end() ? it->getTerminator() : nullptr;
+}
+
+/// Prunes unreachable blocks from the CFG using the \p worklist. This function
+/// iteratively removes blocks that have no predecessors. When a block is
+/// erased, its successors are added to the worklist as they may consequently
+/// become unreachable. This ensures a cascading deletion of dead-end paths in
+/// the control flow graph.
+static void pruneCFGEdges(SetVector<Block *> &workList, IRRewriter &rewriter) {
+ while (!workList.empty()) {
+ Block *b = workList.front();
+ workList.erase(workList.begin());
+ if (b->hasNoPredecessors()) {
+ for (Block *it : b->getSuccessors())
+ workList.insert(it);
+ rewriter.eraseBlock(b);
+ }
+ }
+}
+
+/// Reduces the control flow in a region by iteratively forcing branching
+/// terminators to point to a single successor. It evaluates each potential
+/// branch path and commits the reduction that results in the smallest
+/// "interesting" module.
+static LogicalResult reduceConditionalsInRegion(ModuleOp module, Region ®ion,
----------------
jpienaar wrote:
Same question as below, this is seems like a semantic preserving transformation that could be useful in general, why is it a reduction specific one?
https://github.com/llvm/llvm-project/pull/191961
More information about the Mlir-commits
mailing list