[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 ®ion, 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 ®ion, 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