[Mlir-commits] [mlir] 593683f - [OpenACC][NFC] Generalize wrapMultiBlockRegionWithSCFExecuteRegion (#187359)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Mar 19 09:02:35 PDT 2026


Author: Zhen Wang
Date: 2026-03-19T16:02:29Z
New Revision: 593683f9a0eb53018ab1548ca55be9ff57cb1b23

URL: https://github.com/llvm/llvm-project/commit/593683f9a0eb53018ab1548ca55be9ff57cb1b23
DIFF: https://github.com/llvm/llvm-project/commit/593683f9a0eb53018ab1548ca55be9ff57cb1b23.diff

LOG: [OpenACC][NFC] Generalize wrapMultiBlockRegionWithSCFExecuteRegion (#187359)

Simplify `wrapMultiBlockRegionWithSCFExecuteRegion` by replacing the
`bool convertFuncReturn` parameter with a generic `getNumSuccessors() ==
0` check. Terminators with no successors are by definition region exit
points, so they can be identified automatically without requiring
callers to specify types. This enables downstream dialects (e.g., CUF
with fir::FirEndOp) to reuse the utility without modifying it.

```
// Before:
wrapMultiBlockRegionWithSCFExecuteRegion(region, mapping, loc, rewriter, /*convertFuncReturn=*/true);

// After:
wrapMultiBlockRegionWithSCFExecuteRegion(region, mapping, loc, rewriter);
```

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/OpenACC/OpenACCUtilsLoop.h
    mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
    mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp
    mlir/unittests/Dialect/OpenACC/OpenACCUtilsLoopTest.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCUtilsLoop.h b/mlir/include/mlir/Dialect/OpenACC/OpenACCUtilsLoop.h
index e0428bec620ca..faaa8231e696e 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCUtilsLoop.h
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCUtilsLoop.h
@@ -31,24 +31,21 @@ cloneACCRegionInto(Region *src, Block *dest, Block::iterator inlinePoint,
                    IRMapping &mapping, ValueRange resultsToReplace);
 
 /// Wrap a multi-block region in an scf.execute_region.
-/// Clones the given region into a new scf.execute_region. Replaces acc.yield
-/// with scf.yield; when convertFuncReturn is true, also replaces func.return
-/// with scf.yield. Use this to convert unstructured control flow (e.g. multiple
-/// blocks with branches) into a single SCF region.
+/// Clones the given region into a new scf.execute_region. Terminators with no
+/// successors (i.e., region exit points) are replaced with scf.yield. Use this
+/// to convert unstructured control flow (e.g. multiple blocks with branches)
+/// into a single SCF region.
 /// @param region The region to wrap (cloned into the execute_region; not
 /// modified).
 /// @param mapping IR mapping for the clone; updated with block and value
 /// mappings.
 /// @param loc Location for the created execute_region op.
 /// @param rewriter RewriterBase for creating and erasing operations.
-/// @param convertFuncReturn When true, replace func.return with scf.yield in
-///        addition to acc.yield. Default is false.
-/// @return The created scf.execute_region operation, or nullptr if any replaced
-///         terminator has operands (results not yet supported).
+/// @return The created scf.execute_region operation.
 scf::ExecuteRegionOp
 wrapMultiBlockRegionWithSCFExecuteRegion(Region &region, IRMapping &mapping,
-                                         Location loc, RewriterBase &rewriter,
-                                         bool convertFuncReturn = false);
+                                         Location loc, RewriterBase &rewriter);
+
 /// Convert a structured acc.loop to scf.for.
 /// The loop arguments are converted to index type. If enableCollapse is true,
 /// nested loops are collapsed into a single loop.

diff  --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 661074444a055..c5fa50642cade 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -100,7 +100,7 @@ ComputeRegionOp buildComputeRegion(Location loc, ValueRange launchArgs,
     YieldOp::create(rewriter, loc, yieldOperands);
   } else {
     auto exeRegion = mlir::acc::wrapMultiBlockRegionWithSCFExecuteRegion(
-        regionToClone, mapping, loc, rewriter, /*convertFuncReturn=*/true);
+        regionToClone, mapping, loc, rewriter);
     if (!exeRegion) {
       rewriter.eraseOp(computeRegion);
       return nullptr;

diff  --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp
index 307d0afb8f697..d9afba7c2daaf 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsLoop.cpp
@@ -14,7 +14,6 @@
 
 #include "mlir/Dialect/Arith/IR/Arith.h"
 #include "mlir/Dialect/Arith/Utils/Utils.h"
-#include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/Dialect/OpenACC/OpenACC.h"
 #include "mlir/Dialect/SCF/IR/SCF.h"
 #include "mlir/Dialect/SCF/Utils/Utils.h"
@@ -149,15 +148,13 @@ cloneACCRegionInto(Region *src, Block *dest, Block::iterator inlinePoint,
 /// Wrap a multi-block region with scf.execute_region.
 scf::ExecuteRegionOp
 wrapMultiBlockRegionWithSCFExecuteRegion(Region &region, IRMapping &mapping,
-                                         Location loc, RewriterBase &rewriter,
-                                         bool convertFuncReturn) {
+                                         Location loc, RewriterBase &rewriter) {
   SmallVector<Operation *> terminators;
   for (Block &block : region.getBlocks()) {
     if (block.empty())
       continue;
     Operation *term = block.getTerminator();
-    if ((convertFuncReturn && isa<func::ReturnOp>(*term)) ||
-        isa<acc::YieldOp>(*term))
+    if (term->getNumSuccessors() == 0)
       terminators.push_back(term);
   }
   SmallVector<Type> resultTypes;

diff  --git a/mlir/unittests/Dialect/OpenACC/OpenACCUtilsLoopTest.cpp b/mlir/unittests/Dialect/OpenACC/OpenACCUtilsLoopTest.cpp
index f2b7295f68aec..4296d56dfa4d9 100644
--- a/mlir/unittests/Dialect/OpenACC/OpenACCUtilsLoopTest.cpp
+++ b/mlir/unittests/Dialect/OpenACC/OpenACCUtilsLoopTest.cpp
@@ -806,8 +806,8 @@ TEST_F(OpenACCUtilsLoopTest,
 
   b.setInsertionPointAfter(funcOp);
   IRMapping mapping;
-  scf::ExecuteRegionOp exeRegionOp = wrapMultiBlockRegionWithSCFExecuteRegion(
-      region, mapping, loc, b, /*convertFuncReturn=*/true);
+  scf::ExecuteRegionOp exeRegionOp =
+      wrapMultiBlockRegionWithSCFExecuteRegion(region, mapping, loc, b);
 
   ASSERT_TRUE(exeRegionOp);
 
@@ -873,8 +873,8 @@ TEST_F(OpenACCUtilsLoopTest,
 
   b.setInsertionPointAfter(funcOp);
   IRMapping mapping;
-  scf::ExecuteRegionOp exeRegionOp = wrapMultiBlockRegionWithSCFExecuteRegion(
-      region, mapping, loc, b, /*convertFuncReturn=*/true);
+  scf::ExecuteRegionOp exeRegionOp =
+      wrapMultiBlockRegionWithSCFExecuteRegion(region, mapping, loc, b);
 
   ASSERT_TRUE(exeRegionOp);
 


        


More information about the Mlir-commits mailing list