[Mlir-commits] [mlir] [mlir][acc] Fixed side effects for [first]private/reduction. (PR #180791)
Slava Zakharin
llvmlistbot at llvm.org
Tue Feb 10 09:50:17 PST 2026
https://github.com/vzakhari created https://github.com/llvm/llvm-project/pull/180791
This patch moves the definitions of memory effects for the data
entry/exit operations into C++ code. The main reason for this
is to modify the effects of [first]private and reduction
operations: they should not access `CurrentDeviceIdResource`
when they are located inside a compute construct.
The ODS to C++ migration was done with AI assistance. I reviewed
these changes and made sure it was an NFC change. After that
I modified [first]private and reduction implementations.
>From e72800f96b52ce0a99eeeac45598a545efb8e1ab Mon Sep 17 00:00:00 2001
From: Slava Zakharin <szakharin at nvidia.com>
Date: Tue, 10 Feb 2026 09:24:55 -0800
Subject: [PATCH] [mlir][acc] Fixed side effects for [first]private/reduction.
This patch moves the definitions of memory effects for the data
entry/exit operations into C++ code. The main reason for this
is to modify the effects of [first]private and reduction
operations: they should not access `CurrentDeviceIdResource`
when they are located inside a compute construct.
The ODS to C++ migration was done with AI assistance. I reviewed
these changes and made sure it was an NFC change. After that
I modified [first]private and reduction implementations.
---
.../mlir/Dialect/OpenACC/OpenACCCGOps.td | 9 +-
.../mlir/Dialect/OpenACC/OpenACCOps.td | 164 ++++++-----
mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp | 264 ++++++++++++++++++
3 files changed, 348 insertions(+), 89 deletions(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
index ee249bb7c3c99..8f7c8c2a89be9 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGOps.td
@@ -79,9 +79,10 @@ def OpenACC_KernelEnvironmentOp
// acc.firstprivate_map
//===----------------------------------------------------------------------===//
-def OpenACC_FirstprivateMapInitialOp : OpenACC_DataEntryOp<"firstprivate_map",
- "mlir::acc::DataClause::acc_firstprivate", "", [],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_FirstprivateMapInitialOp
+ : OpenACC_DataEntryOp<
+ "firstprivate_map", "mlir::acc::DataClause::acc_firstprivate", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents the mapping of the initial value for firstprivate "
"semantics.";
let description = [{
@@ -97,7 +98,7 @@ def OpenACC_FirstprivateMapInitialOp : OpenACC_DataEntryOp<"firstprivate_map",
being accessed directly
}];
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
}
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 0a146db767760..b64cf50b4dba7 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -646,11 +646,13 @@ def OpenACC_GetExtentOp : OpenACC_Op<"get_extent", [NoMemoryEffect]> {
// The bounds are represented in rank order. Rank 0 (inner-most dimension) is
// the first.
//
-class OpenACC_DataEntryOp<string mnemonic, string clause, string extraDescription,
- list<Trait> traits = [], dag additionalArgs = (ins)> :
- OpenACC_Op<mnemonic, !listconcat(traits,
- [AttrSizedOperandSegments,
- MemoryEffects<[MemRead<OpenACC_CurrentDeviceIdResource>]>])> {
+class OpenACC_DataEntryOp<string mnemonic, string clause,
+ string extraDescription, list<Trait> traits = [],
+ dag additionalArgs = (ins)>
+ : OpenACC_Op<mnemonic,
+ !listconcat(traits, [AttrSizedOperandSegments,
+ DeclareOpInterfaceMethods<
+ MemoryEffectsOpInterface>])> {
let arguments = !con(
additionalArgs,
(ins TypeAttr:$varType,
@@ -836,42 +838,43 @@ def OpenACC_PrivateOp : OpenACC_DataEntryOp<"private",
(ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Represents private semantics for acc private clause.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
}
//===----------------------------------------------------------------------===//
// 2.5.14 firstprivate clause
//===----------------------------------------------------------------------===//
-def OpenACC_FirstprivateOp : OpenACC_DataEntryOp<"firstprivate",
- "mlir::acc::DataClause::acc_firstprivate", "", [],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_FirstprivateOp
+ : OpenACC_DataEntryOp<
+ "firstprivate", "mlir::acc::DataClause::acc_firstprivate", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents firstprivate semantic for the acc firstprivate "
"clause.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
}
//===----------------------------------------------------------------------===//
// 2.5.15 reduction clause
//===----------------------------------------------------------------------===//
-def OpenACC_ReductionOp : OpenACC_DataEntryOp<"reduction",
- "mlir::acc::DataClause::acc_reduction", "", [],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_ReductionOp
+ : OpenACC_DataEntryOp<
+ "reduction", "mlir::acc::DataClause::acc_reduction", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents reduction semantics for acc reduction clause.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
}
//===----------------------------------------------------------------------===//
// 2.7.4 deviceptr clause
//===----------------------------------------------------------------------===//
-def OpenACC_DevicePtrOp : OpenACC_DataEntryOp<"deviceptr",
- "mlir::acc::DataClause::acc_deviceptr", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_DevicePtrOp
+ : OpenACC_DataEntryOp<"deviceptr", "mlir::acc::DataClause::acc_deviceptr",
+ "", [], (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Specifies that the variable pointer is a device pointer.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -880,11 +883,9 @@ def OpenACC_DevicePtrOp : OpenACC_DataEntryOp<"deviceptr",
//===----------------------------------------------------------------------===//
// 2.7.5 present clause
//===----------------------------------------------------------------------===//
-def OpenACC_PresentOp : OpenACC_DataEntryOp<"present",
- "mlir::acc::DataClause::acc_present", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_PresentOp
+ : OpenACC_DataEntryOp<"present", "mlir::acc::DataClause::acc_present",
+ "", [], (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Specifies that the variable is already present on device.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -893,15 +894,14 @@ def OpenACC_PresentOp : OpenACC_DataEntryOp<"present",
//===----------------------------------------------------------------------===//
// 2.7.7 copyin clause
//===----------------------------------------------------------------------===//
-def OpenACC_CopyinOp : OpenACC_DataEntryOp<"copyin",
- "mlir::acc::DataClause::acc_copyin", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_CopyinOp
+ : OpenACC_DataEntryOp<
+ "copyin", "mlir::acc::DataClause::acc_copyin", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents copyin semantics for acc data clauses like acc "
"copyin and acc copy.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase # [{
/// Check if this is a copyin with readonly modifier.
@@ -912,15 +912,13 @@ def OpenACC_CopyinOp : OpenACC_DataEntryOp<"copyin",
//===----------------------------------------------------------------------===//
// 2.7.9 create clause
//===----------------------------------------------------------------------===//
-def OpenACC_CreateOp : OpenACC_DataEntryOp<"create",
- "mlir::acc::DataClause::acc_create", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_CreateOp
+ : OpenACC_DataEntryOp<"create", "mlir::acc::DataClause::acc_create", "", [],
+ (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Represents create semantics for acc data clauses like acc "
"create and acc copyout.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase # [{
/// Check if this is a create with zero modifier.
@@ -931,11 +929,9 @@ def OpenACC_CreateOp : OpenACC_DataEntryOp<"create",
//===----------------------------------------------------------------------===//
// 2.7.10 no_create clause
//===----------------------------------------------------------------------===//
-def OpenACC_NoCreateOp : OpenACC_DataEntryOp<"nocreate",
- "mlir::acc::DataClause::acc_no_create", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_NoCreateOp
+ : OpenACC_DataEntryOp<"nocreate", "mlir::acc::DataClause::acc_no_create",
+ "", [], (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Represents acc no_create semantics.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -944,11 +940,10 @@ def OpenACC_NoCreateOp : OpenACC_DataEntryOp<"nocreate",
//===----------------------------------------------------------------------===//
// 2.7.12 attach clause
//===----------------------------------------------------------------------===//
-def OpenACC_AttachOp : OpenACC_DataEntryOp<"attach",
- "mlir::acc::DataClause::acc_attach", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_AttachOp
+ : OpenACC_DataEntryOp<
+ "attach", "mlir::acc::DataClause::acc_attach", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents acc attach semantics which updates a pointer in "
"device memory with the corresponding device address of the "
"pointee.";
@@ -964,15 +959,16 @@ def OpenACC_AttachOp : OpenACC_DataEntryOp<"attach",
// It is also useful for providing the device address for unstructured construct
// exit_data since unlike structured constructs, there is no matching data entry
// operation.
-def OpenACC_GetDevicePtrOp : OpenACC_DataEntryOp<"getdeviceptr",
- "mlir::acc::DataClause::acc_getdeviceptr", [{
+def OpenACC_GetDevicePtrOp
+ : OpenACC_DataEntryOp<"getdeviceptr",
+ "mlir::acc::DataClause::acc_getdeviceptr", [{
This operation is used to get the `accPtr` for a variable. This is often
used in conjunction with data exit operations when the data entry
operation is not visible. This operation can have a `dataClause` argument
that is any of the valid `mlir::acc::DataClause` entries.
\
- }], [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+ }],
+ [], (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Gets device address if variable exists on device.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let hasVerifier = 0;
@@ -982,22 +978,22 @@ def OpenACC_GetDevicePtrOp : OpenACC_DataEntryOp<"getdeviceptr",
//===----------------------------------------------------------------------===//
// 2.14.4 device clause
//===----------------------------------------------------------------------===//
-def OpenACC_UpdateDeviceOp : OpenACC_DataEntryOp<"update_device",
- "mlir::acc::DataClause::acc_update_device", "", [],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_UpdateDeviceOp
+ : OpenACC_DataEntryOp<
+ "update_device", "mlir::acc::DataClause::acc_update_device", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents acc update device semantics.";
let results = (outs Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable",[MemWrite]>:$accVar);
+ "Accelerator mapped variable">:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
}
//===----------------------------------------------------------------------===//
// 2.8 use_device clause
//===----------------------------------------------------------------------===//
-def OpenACC_UseDeviceOp : OpenACC_DataEntryOp<"use_device",
- "mlir::acc::DataClause::acc_use_device", "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>]>],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_UseDeviceOp
+ : OpenACC_DataEntryOp<"use_device", "mlir::acc::DataClause::acc_use_device",
+ "", [], (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Represents acc use_device semantics.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -1006,10 +1002,11 @@ def OpenACC_UseDeviceOp : OpenACC_DataEntryOp<"use_device",
//===----------------------------------------------------------------------===//
// 2.13.1 device_resident clause
//===----------------------------------------------------------------------===//
-def OpenACC_DeclareDeviceResidentOp : OpenACC_DataEntryOp<"declare_device_resident",
- "mlir::acc::DataClause::acc_declare_device_resident", "",
- [MemoryEffects<[MemWrite<OpenACC_RuntimeCounters>]>],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_DeclareDeviceResidentOp
+ : OpenACC_DataEntryOp<
+ "declare_device_resident",
+ "mlir::acc::DataClause::acc_declare_device_resident", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents acc declare device_resident semantics.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -1018,10 +1015,10 @@ def OpenACC_DeclareDeviceResidentOp : OpenACC_DataEntryOp<"declare_device_reside
//===----------------------------------------------------------------------===//
// 2.13.3 link clause
//===----------------------------------------------------------------------===//
-def OpenACC_DeclareLinkOp : OpenACC_DataEntryOp<"declare_link",
- "mlir::acc::DataClause::acc_declare_link", "",
- [MemoryEffects<[MemWrite<OpenACC_RuntimeCounters>]>],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Host variable",[MemRead]>:$var)> {
+def OpenACC_DeclareLinkOp
+ : OpenACC_DataEntryOp<
+ "declare_link", "mlir::acc::DataClause::acc_declare_link", "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var)> {
let summary = "Represents acc declare link semantics.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
let extraClassDeclaration = extraClassDeclarationBase;
@@ -1030,9 +1027,9 @@ def OpenACC_DeclareLinkOp : OpenACC_DataEntryOp<"declare_link",
//===----------------------------------------------------------------------===//
// 2.10 cache directive
//===----------------------------------------------------------------------===//
-def OpenACC_CacheOp : OpenACC_DataEntryOp<"cache",
- "mlir::acc::DataClause::acc_cache", "", [NoMemoryEffect],
- (ins OpenACC_AnyPointerOrMappableType:$var)> {
+def OpenACC_CacheOp
+ : OpenACC_DataEntryOp<"cache", "mlir::acc::DataClause::acc_cache", "", [],
+ (ins OpenACC_AnyPointerOrMappableType:$var)> {
let summary = "Represents the cache directive that is associated with a "
"loop.";
let results = (outs OpenACC_AnyPointerOrMappableType:$accVar);
@@ -1047,11 +1044,13 @@ def OpenACC_CacheOp : OpenACC_DataEntryOp<"cache",
// terminology used in this dialect. It refers to data operations that will appear
// after data or compute region. It will be used as the base of acc dialect
// operations for the following OpenACC data clauses: copyout, detach, delete.
-class OpenACC_DataExitOp<string mnemonic, string clause, string extraDescription,
- list<Trait> traits = [], dag additionalArgs = (ins)> :
- OpenACC_Op<mnemonic, !listconcat(traits,
- [AttrSizedOperandSegments,
- MemoryEffects<[MemRead<OpenACC_CurrentDeviceIdResource>]>])> {
+class OpenACC_DataExitOp<string mnemonic, string clause,
+ string extraDescription, list<Trait> traits = [],
+ dag additionalArgs = (ins)>
+ : OpenACC_Op<mnemonic,
+ !listconcat(traits, [AttrSizedOperandSegments,
+ DeclareOpInterfaceMethods<
+ MemoryEffectsOpInterface>])> {
let arguments = !con(additionalArgs,
(ins Variadic<OpenACC_DataBoundsType>:$bounds,
Variadic<IntOrIndex>:$asyncOperands,
@@ -1135,13 +1134,10 @@ class OpenACC_DataExitOp<string mnemonic, string clause, string extraDescription
class OpenACC_DataExitOpWithVarPtr<string mnemonic, string clause>
: OpenACC_DataExitOp<
mnemonic, clause,
- "- `varPtr`: The address of variable to copy back to.",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
+ "- `varPtr`: The address of variable to copy back to.", [],
(ins Arg<OpenACC_AnyPointerOrMappableType,
- "Accelerator mapped variable", [MemRead]>:$accVar,
- Arg<OpenACC_AnyPointerOrMappableType,
- "Host variable", [MemWrite]>:$var,
+ "Accelerator mapped variable">:$accVar,
+ Arg<OpenACC_AnyPointerOrMappableType, "Host variable">:$var,
TypeAttr:$varType)> {
let assemblyFormat = [{
custom<AccVar>($accVar, type($accVar))
@@ -1212,12 +1208,10 @@ class OpenACC_DataExitOpWithVarPtr<string mnemonic, string clause>
}];
}
-class OpenACC_DataExitOpNoVarPtr<string mnemonic, string clause> :
- OpenACC_DataExitOp<mnemonic, clause, "",
- [MemoryEffects<[MemRead<OpenACC_RuntimeCounters>,
- MemWrite<OpenACC_RuntimeCounters>]>],
- (ins Arg<OpenACC_AnyPointerOrMappableType,"Accelerator mapped variable",
- [MemRead]>:$accVar)> {
+class OpenACC_DataExitOpNoVarPtr<string mnemonic, string clause>
+ : OpenACC_DataExitOp<mnemonic, clause, "", [],
+ (ins Arg<OpenACC_AnyPointerOrMappableType,
+ "Accelerator mapped variable">:$accVar)> {
let assemblyFormat = [{
custom<AccVar>($accVar, type($accVar))
(`bounds` `(` $bounds^ `)` )?
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index f405fbbbd838d..460314f8f678f 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -1224,6 +1224,270 @@ bool acc::CacheOp::isCacheReadonly() {
acc::DataClauseModifier::readonly);
}
+//===----------------------------------------------------------------------===//
+// Data entry/exit operations - getEffects implementations
+//===----------------------------------------------------------------------===//
+
+// This function returns true iff the given operation is enclosed
+// in any ACC_COMPUTE_CONSTRUCT_OPS operation.
+// It is quite alike acc::getEnclosingComputeOp() utility,
+// but we cannot use it here.
+static bool isEnclosedIntoComputeOp(mlir::Operation *op) {
+ mlir::Operation *parentOp = op->getParentOp();
+ while (parentOp) {
+ if (mlir::isa<ACC_COMPUTE_CONSTRUCT_OPS>(parentOp))
+ return true;
+ parentOp = parentOp->getParentOp();
+ }
+ return false;
+}
+
+/// Helper to add an effect on an operand, referenced by its mutable range.
+template <typename EffectTy>
+static void addOperandEffect(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects,
+ MutableOperandRange operand) {
+ for (unsigned i = 0, e = operand.size(); i < e; ++i)
+ effects.emplace_back(EffectTy::get(), &operand[i]);
+}
+
+/// Helper to add an effect on a result value.
+template <typename EffectTy>
+static void addResultEffect(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects,
+ Value result) {
+ effects.emplace_back(EffectTy::get(), mlir::cast<mlir::OpResult>(result));
+}
+
+// PrivateOp: accVar result write.
+void acc::PrivateOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ // If acc.private is enclosed into a compute operation,
+ // then it denotes the device side privatization, hence
+ // it does not access the CurrentDeviceIdResource.
+ if (!isEnclosedIntoComputeOp(getOperation()))
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ // TODO: should this be MemoryEffects::Allocate?
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// FirstprivateOp: var read, accVar result write.
+void acc::FirstprivateOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ // If acc.firstprivate is enclosed into a compute operation,
+ // then it denotes the device side privatization, hence
+ // it does not access the CurrentDeviceIdResource.
+ if (!isEnclosedIntoComputeOp(getOperation()))
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// FirstprivateMapInitialOp: var read, accVar result write.
+void acc::FirstprivateMapInitialOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// ReductionOp: var read, accVar result write.
+void acc::ReductionOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ // If acc.reduction is enclosed into a compute operation,
+ // then it denotes the device side reduction, hence
+ // it does not access the CurrentDeviceIdResource.
+ if (!isEnclosedIntoComputeOp(getOperation()))
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// DevicePtrOp: RuntimeCounters read.
+void acc::DevicePtrOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+}
+
+// PresentOp: RuntimeCounters read+write.
+void acc::PresentOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+}
+
+// CopyinOp: RuntimeCounters read+write, var read, accVar result write.
+void acc::CopyinOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// CreateOp: RuntimeCounters read+write, accVar result write.
+void acc::CreateOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ // TODO: should this be MemoryEffects::Allocate?
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// NoCreateOp: RuntimeCounters read+write.
+void acc::NoCreateOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+}
+
+// AttachOp: RuntimeCounters read+write, var read.
+void acc::AttachOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ // TODO: should we also add MemoryEffects::Write?
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+}
+
+// GetDevicePtrOp: RuntimeCounters read.
+void acc::GetDevicePtrOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+}
+
+// UpdateDeviceOp: var read, accVar result write.
+void acc::UpdateDeviceOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+ addResultEffect<MemoryEffects::Write>(effects, getAccVar());
+}
+
+// UseDeviceOp: RuntimeCounters read.
+void acc::UseDeviceOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+}
+
+// DeclareDeviceResidentOp: RuntimeCounters write, var read.
+void acc::DeclareDeviceResidentOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+}
+
+// DeclareLinkOp: RuntimeCounters write, var read.
+void acc::DeclareLinkOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getVarMutable());
+}
+
+// CacheOp: NoMemoryEffect
+void acc::CacheOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {}
+
+// CopyoutOp: RuntimeCounters read+write, accVar read, var write.
+void acc::CopyoutOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getAccVarMutable());
+ addOperandEffect<MemoryEffects::Write>(effects, getVarMutable());
+}
+
+// DeleteOp: RuntimeCounters read+write, accVar read.
+void acc::DeleteOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getAccVarMutable());
+}
+
+// DetachOp: RuntimeCounters read+write, accVar read.
+void acc::DetachOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getAccVarMutable());
+}
+
+// UpdateHostOp: RuntimeCounters read+write, accVar read, var write.
+void acc::UpdateHostOp::getEffects(
+ SmallVectorImpl<SideEffects::EffectInstance<MemoryEffects::Effect>>
+ &effects) {
+ effects.emplace_back(MemoryEffects::Read::get(), acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Write::get(),
+ acc::RuntimeCounters::get());
+ effects.emplace_back(MemoryEffects::Read::get(),
+ acc::CurrentDeviceIdResource::get());
+ addOperandEffect<MemoryEffects::Read>(effects, getAccVarMutable());
+ addOperandEffect<MemoryEffects::Write>(effects, getVarMutable());
+}
+
template <typename StructureOp>
static ParseResult parseRegions(OpAsmParser &parser, OperationState &state,
unsigned nRegions = 1) {
More information about the Mlir-commits
mailing list