[Mlir-commits] [mlir] a8a1551 - [acc] RegionBranchOpInterface for acc regions (#171533)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Dec 9 19:50:04 PST 2025
Author: Susan Tan (ス-ザン タン)
Date: 2025-12-09T22:50:00-05:00
New Revision: a8a15515c99c5eeb77ad825474f818887ddc70e8
URL: https://github.com/llvm/llvm-project/commit/a8a15515c99c5eeb77ad825474f818887ddc70e8
DIFF: https://github.com/llvm/llvm-project/commit/a8a15515c99c5eeb77ad825474f818887ddc70e8.diff
LOG: [acc] RegionBranchOpInterface for acc regions (#171533)
Defining RegionBranchOpInterface for acc regions will help dataflow
analysis to propagate IN/OUT sets without losing information
Added:
Modified:
mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 146dc5d087a31..349dc8bb858b5 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -1678,12 +1678,14 @@ def OpenACC_ReductionRecipeOp
// 2.5.1 parallel Construct
//===----------------------------------------------------------------------===//
-def OpenACC_ParallelOp : OpenACC_Op<"parallel",
- [AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
- DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_ParallelOp
+ : OpenACC_Op<"parallel",
+ [AttrSizedOperandSegments, AutomaticAllocationScope,
+ RecursiveMemoryEffects,
+ DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "parallel construct";
let description = [{
The "acc.parallel" operation represents a parallel construct block. It has
@@ -1876,12 +1878,14 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel",
// 2.5.2 serial Construct
//===----------------------------------------------------------------------===//
-def OpenACC_SerialOp : OpenACC_Op<"serial",
- [AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
- DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_SerialOp
+ : OpenACC_Op<"serial",
+ [AttrSizedOperandSegments, AutomaticAllocationScope,
+ RecursiveMemoryEffects,
+ DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "serial construct";
let description = [{
The "acc.serial" operation represents a serial construct block. It has
@@ -2014,12 +2018,14 @@ def OpenACC_SerialOp : OpenACC_Op<"serial",
// 2.5.1 kernels Construct
//===----------------------------------------------------------------------===//
-def OpenACC_KernelsOp : OpenACC_Op<"kernels",
- [AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
- DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_KernelsOp
+ : OpenACC_Op<"kernels",
+ [AttrSizedOperandSegments, AutomaticAllocationScope,
+ RecursiveMemoryEffects,
+ DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "kernels construct";
let description = [{
The "acc.kernels" operation represents a kernels construct block. It has
@@ -2194,11 +2200,13 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
// acc.kernel_environment
//===----------------------------------------------------------------------===//
-def OpenACC_KernelEnvironmentOp : OpenACC_Op<"kernel_environment",
- [AttrSizedOperandSegments, RecursiveMemoryEffects, SingleBlock,
- NoTerminator,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_KernelEnvironmentOp
+ : OpenACC_Op<"kernel_environment",
+ [AttrSizedOperandSegments, RecursiveMemoryEffects, SingleBlock,
+ NoTerminator,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "Decomposition of compute constructs to capture data mapping "
"and asynchronous behavior information";
let description = [{
@@ -2246,10 +2254,12 @@ def OpenACC_KernelEnvironmentOp : OpenACC_Op<"kernel_environment",
// 2.6.5 data Construct
//===----------------------------------------------------------------------===//
-def OpenACC_DataOp : OpenACC_Op<"data",
- [AttrSizedOperandSegments, RecursiveMemoryEffects,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_DataOp
+ : OpenACC_Op<
+ "data", [AttrSizedOperandSegments, RecursiveMemoryEffects,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "data construct";
let description = [{
@@ -2517,10 +2527,12 @@ def OpenACC_ExitDataOp : OpenACC_Op<"exit_data",
// 2.8 Host_Data Construct
//===----------------------------------------------------------------------===//
-def OpenACC_HostDataOp : OpenACC_Op<"host_data",
- [AttrSizedOperandSegments,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
- MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
+def OpenACC_HostDataOp
+ : OpenACC_Op<"host_data",
+ [AttrSizedOperandSegments,
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>,
+ MemRead<OpenACC_CurrentDeviceIdResource>]>]> {
let summary = "host_data construct";
let description = [{
@@ -2558,12 +2570,13 @@ def OpenACC_HostDataOp : OpenACC_Op<"host_data",
// 2.9 loop Construct
//===----------------------------------------------------------------------===//
-def OpenACC_LoopOp : OpenACC_Op<"loop",
- [AttrSizedOperandSegments, AutomaticAllocationScope,
- RecursiveMemoryEffects,
- DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
- DeclareOpInterfaceMethods<LoopLikeOpInterface>,
- MemoryEffects<[MemWrite<OpenACC_ConstructResource>]>]> {
+def OpenACC_LoopOp
+ : OpenACC_Op<
+ "loop", [AttrSizedOperandSegments, AutomaticAllocationScope,
+ RecursiveMemoryEffects,
+ DeclareOpInterfaceMethods<ComputeRegionOpInterface>,
+ DeclareOpInterfaceMethods<LoopLikeOpInterface>,
+ MemoryEffects<[MemWrite<OpenACC_ConstructResource>]>]> {
let summary = "loop construct";
let description = [{
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index 47f122267246b..3dea621003a75 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -389,6 +389,61 @@ void OpenACCDialect::initialize() {
memref::GlobalOp::attachInterface<MemrefGlobalVariableModel>(*getContext());
}
+//===----------------------------------------------------------------------===//
+// RegionBranchOpInterface for acc.kernels / acc.parallel / acc.serial /
+// acc.kernel_environment / acc.data / acc.host_data
+//===----------------------------------------------------------------------===//
+
+/// Generic helper for single-region OpenACC ops that execute their body once
+/// and then return to the parent operation with their results (if any).
+static void
+getSingleRegionOpSuccessorRegions(Operation *op, Region ®ion,
+ RegionBranchPoint point,
+ SmallVectorImpl<RegionSuccessor> ®ions) {
+ if (point.isParent()) {
+ regions.push_back(RegionSuccessor(®ion));
+ return;
+ }
+
+ regions.push_back(RegionSuccessor(op, op->getResults()));
+}
+
+void KernelsOp::getSuccessorRegions(RegionBranchPoint point,
+ SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
+void ParallelOp::getSuccessorRegions(
+ RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
+void SerialOp::getSuccessorRegions(RegionBranchPoint point,
+ SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
+void KernelEnvironmentOp::getSuccessorRegions(
+ RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
+void DataOp::getSuccessorRegions(RegionBranchPoint point,
+ SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
+void HostDataOp::getSuccessorRegions(
+ RegionBranchPoint point, SmallVectorImpl<RegionSuccessor> ®ions) {
+ getSingleRegionOpSuccessorRegions(getOperation(), getRegion(), point,
+ regions);
+}
+
//===----------------------------------------------------------------------===//
// device_type support helpers
//===----------------------------------------------------------------------===//
More information about the Mlir-commits
mailing list