[flang-commits] [flang] [mlir] [acc] Introduce varType to acc data clause operations (PR #119007)
Razvan Lupusoru via flang-commits
flang-commits at lists.llvm.org
Fri Dec 6 10:45:47 PST 2024
https://github.com/razvanlupusoru updated https://github.com/llvm/llvm-project/pull/119007
>From 10c5b9840260cd587c3a2b93a7dd17f4155d52dd Mon Sep 17 00:00:00 2001
From: Razvan Lupusoru <rlupusoru at nvidia.com>
Date: Fri, 6 Dec 2024 10:30:53 -0800
Subject: [PATCH 1/2] [acc] Introduce varType to acc data clause operations
The acc data clause operations hold an operand named `varPtr`. This
was intended to hold a pointer to a variable - where the element type
of that pointer specifies the type of the variable. However, for
both memref and llvm dialects, this assumption is not true. This is
because memref element type for cases like memref<10xf32> is simply
f32 and for LLVM, after opaque pointers, the variable type is no longer
recoverable.
Thus, introduce varType to ensure that appropriate semantics are kept.
Both the parser and printer for this new type attribute allow it to
not be specified in cases where a dialect's getElementType() applied
to `varPtr`'s type has a recoverable type. And more specifically, for
FIR, no changes are needed in the MLIR unit tests.
---
flang/lib/Lower/OpenACC.cpp | 8 +-
.../mlir/Dialect/OpenACC/OpenACCOps.td | 131 +++++-----
mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp | 39 +++
.../OpenACCToSCF/convert-openacc-to-scf.mlir | 18 +-
mlir/test/Dialect/OpenACC/canonicalize.mlir | 28 +--
mlir/test/Dialect/OpenACC/invalid.mlir | 14 +-
mlir/test/Dialect/OpenACC/legalize-data.mlir | 32 +--
mlir/test/Dialect/OpenACC/ops.mlir | 226 +++++++++---------
mlir/test/Target/LLVMIR/openacc-llvm.mlir | 20 +-
9 files changed, 278 insertions(+), 238 deletions(-)
diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 878dccc4ecbc4b..75dcf6ec3e1107 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -139,6 +139,8 @@ createDataEntryOp(fir::FirOpBuilder &builder, mlir::Location loc,
op.setStructured(structured);
op.setImplicit(implicit);
op.setDataClause(dataClause);
+ op.setVarType(mlir::cast<mlir::acc::PointerLikeType>(baseAddr.getType())
+ .getElementType());
op->setAttr(Op::getOperandSegmentSizeAttr(),
builder.getDenseI32ArrayAttr(operandSegments));
if (!asyncDeviceTypes.empty())
@@ -266,8 +268,8 @@ static void createDeclareDeallocFuncWithArg(
if constexpr (std::is_same_v<ExitOp, mlir::acc::CopyoutOp> ||
std::is_same_v<ExitOp, mlir::acc::UpdateHostOp>)
builder.create<ExitOp>(entryOp.getLoc(), entryOp.getAccPtr(),
- entryOp.getVarPtr(), entryOp.getBounds(),
- entryOp.getAsyncOperands(),
+ entryOp.getVarPtr(), entryOp.getVarType(),
+ entryOp.getBounds(), entryOp.getAsyncOperands(),
entryOp.getAsyncOperandsDeviceTypeAttr(),
entryOp.getAsyncOnlyAttr(), entryOp.getDataClause(),
/*structured=*/false, /*implicit=*/false,
@@ -450,7 +452,7 @@ static void genDataExitOperations(fir::FirOpBuilder &builder,
std::is_same_v<ExitOp, mlir::acc::UpdateHostOp>)
builder.create<ExitOp>(
entryOp.getLoc(), entryOp.getAccPtr(), entryOp.getVarPtr(),
- entryOp.getBounds(), entryOp.getAsyncOperands(),
+ entryOp.getVarType(), entryOp.getBounds(), entryOp.getAsyncOperands(),
entryOp.getAsyncOperandsDeviceTypeAttr(), entryOp.getAsyncOnlyAttr(),
entryOp.getDataClause(), structured, entryOp.getImplicit(),
builder.getStringAttr(*entryOp.getName()));
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 8d7e27405cfa46..d089519d7fd808 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -381,17 +381,18 @@ class OpenACC_DataEntryOp<string mnemonic, string clause, string extraDescriptio
OpenACC_Op<mnemonic, !listconcat(traits,
[AttrSizedOperandSegments,
MemoryEffects<[MemRead<OpenACC_CurrentDeviceIdResource>]>])> {
- let arguments = !con(additionalArgs,
- (ins
- Optional<OpenACC_PointerLikeTypeInterface>:$varPtrPtr,
- Variadic<OpenACC_DataBoundsType>:$bounds, /* rank-0 to rank-{n-1} */
- Variadic<IntOrIndex>:$asyncOperands,
- OptionalAttr<DeviceTypeArrayAttr>:$asyncOperandsDeviceType,
- OptionalAttr<DeviceTypeArrayAttr>:$asyncOnly,
- DefaultValuedAttr<OpenACC_DataClauseAttr,clause>:$dataClause,
- DefaultValuedAttr<BoolAttr, "true">:$structured,
- DefaultValuedAttr<BoolAttr, "false">:$implicit,
- OptionalAttr<StrAttr>:$name));
+ let arguments = !con(
+ additionalArgs,
+ (ins TypeAttr:$varType,
+ Optional<OpenACC_PointerLikeTypeInterface>:$varPtrPtr,
+ Variadic<OpenACC_DataBoundsType>:$bounds, /* rank-0 to rank-{n-1} */
+ Variadic<IntOrIndex>:$asyncOperands,
+ OptionalAttr<DeviceTypeArrayAttr>:$asyncOperandsDeviceType,
+ OptionalAttr<DeviceTypeArrayAttr>:$asyncOnly,
+ DefaultValuedAttr<OpenACC_DataClauseAttr, clause>:$dataClause,
+ DefaultValuedAttr<BoolAttr, "true">:$structured,
+ DefaultValuedAttr<BoolAttr, "false">:$implicit,
+ OptionalAttr<StrAttr>:$name));
let description = !strconcat(extraDescription, [{
Description of arguments:
@@ -458,7 +459,7 @@ class OpenACC_DataEntryOp<string mnemonic, string clause, string extraDescriptio
}];
let assemblyFormat = [{
- `varPtr` `(` $varPtr `:` type($varPtr) `)`
+ `varPtr` `(` $varPtr `:` custom<varPtrTypes>(type($varPtr), $varType) `)`
oilist(
`varPtrPtr` `(` $varPtrPtr `:` type($varPtrPtr) `)`
| `bounds` `(` $bounds `)`
@@ -469,32 +470,35 @@ class OpenACC_DataEntryOp<string mnemonic, string clause, string extraDescriptio
let hasVerifier = 1;
- let builders = [
- OpBuilder<(ins "::mlir::Value":$varPtr,
- "bool":$structured,
- "bool":$implicit,
- CArg<"::mlir::ValueRange", "{}">:$bounds), [{
- build($_builder, $_state, varPtr.getType(), varPtr, /*varPtrPtr=*/{},
- bounds, /*asyncOperands=*/{}, /*asyncOperandsDeviceType=*/nullptr,
+ let builders = [OpBuilder<(ins "::mlir::Value":$varPtr, "bool":$structured,
+ "bool":$implicit,
+ CArg<"::mlir::ValueRange", "{}">:$bounds),
+ [{
+ build($_builder, $_state, varPtr.getType(), varPtr,
+ /*varType=*/::mlir::TypeAttr::get(
+ ::mlir::cast<::mlir::acc::PointerLikeType>(
+ varPtr.getType()).getElementType()),
+ /*varPtrPtr=*/{}, bounds, /*asyncOperands=*/{},
+ /*asyncOperandsDeviceType=*/nullptr,
/*asyncOnly=*/nullptr, /*dataClause=*/nullptr,
/*structured=*/$_builder.getBoolAttr(structured),
/*implicit=*/$_builder.getBoolAttr(implicit), /*name=*/nullptr);
- }]
- >,
- OpBuilder<(ins "::mlir::Value":$varPtr,
- "bool":$structured,
- "bool":$implicit,
- "const ::llvm::Twine &":$name,
- CArg<"::mlir::ValueRange", "{}">:$bounds), [{
- build($_builder, $_state, varPtr.getType(), varPtr, /*varPtrPtr=*/{},
- bounds, /*asyncOperands=*/{}, /*asyncOperandsDeviceType=*/nullptr,
+ }]>,
+ OpBuilder<(ins "::mlir::Value":$varPtr, "bool":$structured,
+ "bool":$implicit, "const ::llvm::Twine &":$name,
+ CArg<"::mlir::ValueRange", "{}">:$bounds),
+ [{
+ build($_builder, $_state, varPtr.getType(), varPtr,
+ /*varType=*/::mlir::TypeAttr::get(
+ ::mlir::cast<::mlir::acc::PointerLikeType>(
+ varPtr.getType()).getElementType()),
+ /*varPtrPtr=*/{}, bounds, /*asyncOperands=*/{},
+ /*asyncOperandsDeviceType=*/nullptr,
/*asyncOnly=*/nullptr, /*dataClause=*/nullptr,
/*structured=*/$_builder.getBoolAttr(structured),
/*implicit=*/$_builder.getBoolAttr(implicit),
/*name=*/$_builder.getStringAttr(name));
- }]
- >
- ];
+ }]>];
}
//===----------------------------------------------------------------------===//
@@ -794,63 +798,58 @@ class OpenACC_DataExitOp<string mnemonic, string clause, string extraDescription
}
}];
- let assemblyFormat = [{
- `accPtr` `(` $accPtr `:` type($accPtr) `)`
- oilist(
- `bounds` `(` $bounds `)`
- | `to` `varPtr` `(` $varPtr `:` type($varPtr) `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
- ) attr-dict
- }];
-
let hasVerifier = 1;
}
-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>]>],
- (ins Arg<OpenACC_PointerLikeTypeInterface,"Address of device variable",[MemRead]>:$accPtr,
- Arg<OpenACC_PointerLikeTypeInterface,"Address of variable",[MemWrite]>:$varPtr)> {
+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>]>],
+ (ins Arg<OpenACC_PointerLikeTypeInterface,
+ "Address of device variable", [MemRead]>:$accPtr,
+ Arg<OpenACC_PointerLikeTypeInterface,
+ "Address of variable", [MemWrite]>:$varPtr,
+ TypeAttr:$varType)> {
let assemblyFormat = [{
`accPtr` `(` $accPtr `:` type($accPtr) `)`
(`bounds` `(` $bounds^ `)` )?
(`async` `(` custom<DeviceTypeOperands>($asyncOperands,
type($asyncOperands), $asyncOperandsDeviceType)^ `)`)?
- `to` `varPtr` `(` $varPtr `:` type($varPtr) `)`
+ `to` `varPtr` `(` $varPtr `:` custom<varPtrTypes>(type($varPtr), $varType) `)`
attr-dict
}];
- let builders = [
- OpBuilder<(ins "::mlir::Value":$accPtr,
- "::mlir::Value":$varPtr,
- "bool":$structured,
- "bool":$implicit,
- CArg<"::mlir::ValueRange", "{}">:$bounds), [{
+ let builders = [OpBuilder<(ins "::mlir::Value":$accPtr,
+ "::mlir::Value":$varPtr, "bool":$structured,
+ "bool":$implicit,
+ CArg<"::mlir::ValueRange", "{}">:$bounds),
+ [{
build($_builder, $_state, accPtr, varPtr,
+ /*varType=*/::mlir::TypeAttr::get(
+ ::mlir::cast<::mlir::acc::PointerLikeType>(
+ varPtr.getType()).getElementType()),
bounds, /*asyncOperands=*/{}, /*asyncOperandsDeviceType=*/nullptr,
/*asyncOnly=*/nullptr, /*dataClause=*/nullptr,
/*structured=*/$_builder.getBoolAttr(structured),
/*implicit=*/$_builder.getBoolAttr(implicit), /*name=*/nullptr);
- }]
- >,
- OpBuilder<(ins "::mlir::Value":$accPtr,
- "::mlir::Value":$varPtr,
- "bool":$structured,
- "bool":$implicit,
- "const ::llvm::Twine &":$name,
- CArg<"::mlir::ValueRange", "{}">:$bounds), [{
+ }]>,
+ OpBuilder<(ins "::mlir::Value":$accPtr,
+ "::mlir::Value":$varPtr, "bool":$structured,
+ "bool":$implicit, "const ::llvm::Twine &":$name,
+ CArg<"::mlir::ValueRange", "{}">:$bounds),
+ [{
build($_builder, $_state, accPtr, varPtr,
+ /*varType=*/::mlir::TypeAttr::get(
+ ::mlir::cast<::mlir::acc::PointerLikeType>(
+ varPtr.getType()).getElementType()),
bounds, /*asyncOperands=*/{}, /*asyncOperandsDeviceType=*/nullptr,
/*asyncOnly=*/nullptr, /*dataClause=*/nullptr,
/*structured=*/$_builder.getBoolAttr(structured),
/*implicit=*/$_builder.getBoolAttr(implicit),
/*name=*/$_builder.getStringAttr(name));
- }]
- >
- ];
+ }]>];
}
class OpenACC_DataExitOpNoVarPtr<string mnemonic, string clause> :
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index 280260e0485bb5..4daba2679bd91c 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -11,6 +11,7 @@
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
#include "mlir/Dialect/MemRef/IR/MemRef.h"
#include "mlir/IR/Builders.h"
+#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/DialectImplementation.h"
#include "mlir/IR/Matchers.h"
@@ -18,6 +19,7 @@
#include "mlir/Transforms/DialectConversion.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/TypeSwitch.h"
+#include "llvm/Support/LogicalResult.h"
using namespace mlir;
using namespace acc;
@@ -190,6 +192,43 @@ static LogicalResult checkWaitAndAsyncConflict(Op op) {
return success();
}
+static ParseResult parsevarPtrTypes(mlir::OpAsmParser &parser,
+ mlir::Type &varPtrRawType,
+ mlir::TypeAttr &varTypeAttr) {
+ if (failed(parser.parseType(varPtrRawType))) {
+ return failure();
+ }
+
+ // If there is no comma, it means that the varType is implied from the
+ // element type of varPtr.
+ if (succeeded(parser.parseOptionalComma())) {
+ mlir::Type varType;
+ if (failed(parser.parseType(varType)))
+ return failure();
+ varTypeAttr = mlir::TypeAttr::get(varType);
+ } else {
+ varTypeAttr = mlir::TypeAttr::get(
+ mlir::cast<mlir::acc::PointerLikeType>(varPtrRawType).getElementType());
+ }
+
+ return success();
+}
+
+static void printvarPtrTypes(mlir::OpAsmPrinter &p, mlir::Operation *op,
+ mlir::Type varPtrType,
+ mlir::TypeAttr varTypeAttr) {
+ p.printType(varPtrType);
+ mlir::Type varType = varTypeAttr.getValue();
+
+ // Avoid printing the varType if it is already captured as the element type
+ // of varPtr's type.
+ if (mlir::cast<mlir::acc::PointerLikeType>(varPtrType).getElementType() !=
+ varType) {
+ p << ", ";
+ p.printType(varType);
+ }
+}
+
//===----------------------------------------------------------------------===//
// DataBoundsOp
//===----------------------------------------------------------------------===//
diff --git a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
index d8e89f64f8bc04..d83baf3df114bf 100644
--- a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
+++ b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
@@ -1,7 +1,7 @@
// RUN: mlir-opt %s -convert-openacc-to-scf -split-input-file | FileCheck %s
func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -14,7 +14,7 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -28,7 +28,7 @@ func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.update_device varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.update_device varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.update if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -42,7 +42,7 @@ func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
func.func @update_true(%arg0: memref<f32>) {
%true = arith.constant true
- %0 = acc.update_device varPtr(%arg0 : memref<f32>) -> memref<f32>
+ %0 = acc.update_device varPtr(%arg0 : memref<f32>, f32) -> memref<f32>
acc.update if(%true) dataOperands(%0 : memref<f32>)
return
}
@@ -55,7 +55,7 @@ func.func @update_true(%arg0: memref<f32>) {
func.func @update_false(%arg0: memref<f32>) {
%false = arith.constant false
- %0 = acc.update_device varPtr(%arg0 : memref<f32>) -> memref<f32>
+ %0 = acc.update_device varPtr(%arg0 : memref<f32>, f32) -> memref<f32>
acc.update if(%false) dataOperands(%0 : memref<f32>)
return
}
@@ -67,7 +67,7 @@ func.func @update_false(%arg0: memref<f32>) {
func.func @enter_data_true(%d1 : memref<f32>) {
%true = arith.constant true
- %0 = acc.create varPtr(%d1 : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%d1 : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
return
}
@@ -80,7 +80,7 @@ func.func @enter_data_true(%d1 : memref<f32>) {
func.func @enter_data_false(%d1 : memref<f32>) {
%false = arith.constant false
- %0 = acc.create varPtr(%d1 : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%d1 : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
return
}
@@ -92,7 +92,7 @@ func.func @enter_data_false(%d1 : memref<f32>) {
func.func @exit_data_true(%d1 : memref<f32>) {
%true = arith.constant true
- %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
return
@@ -106,7 +106,7 @@ func.func @exit_data_true(%d1 : memref<f32>) {
func.func @exit_data_false(%d1 : memref<f32>) {
%false = arith.constant false
- %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
return
diff --git a/mlir/test/Dialect/OpenACC/canonicalize.mlir b/mlir/test/Dialect/OpenACC/canonicalize.mlir
index e43a27f6b9e89a..c5272f579c1d23 100644
--- a/mlir/test/Dialect/OpenACC/canonicalize.mlir
+++ b/mlir/test/Dialect/OpenACC/canonicalize.mlir
@@ -2,7 +2,7 @@
func.func @testenterdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant true
- %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -13,7 +13,7 @@ func.func @testenterdataop(%a: memref<f32>) -> () {
func.func @testenterdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant false
- %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -25,7 +25,7 @@ func.func @testenterdataop(%a: memref<f32>) -> () {
func.func @testexitdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant true
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -37,7 +37,7 @@ func.func @testexitdataop(%a: memref<f32>) -> () {
func.func @testexitdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant false
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -49,8 +49,8 @@ func.func @testexitdataop(%a: memref<f32>) -> () {
// -----
func.func @testupdateop(%a: memref<f32>) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
%ifCond = arith.constant true
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
@@ -61,8 +61,8 @@ func.func @testupdateop(%a: memref<f32>) -> () {
// -----
func.func @testupdateop(%a: memref<f32>) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
%ifCond = arith.constant false
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
@@ -74,7 +74,7 @@ func.func @testupdateop(%a: memref<f32>) -> () {
// -----
func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -85,7 +85,7 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -97,8 +97,8 @@ func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
}
@@ -109,7 +109,7 @@ func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.use_device varPtr(%a : memref<f32>, f32) -> memref<f32>
%1 = arith.constant 1 : i32
%2 = arith.constant 10 : i32
%false = arith.constant false
@@ -135,7 +135,7 @@ func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
+ %0 = acc.use_device varPtr(%a : memref<f32>, f32) -> memref<f32>
%true = arith.constant true
acc.host_data dataOperands(%0 : memref<f32>) if(%true) {
}
diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir
index 0cc65f7b30d98d..a0ba873c73ff19 100644
--- a/mlir/test/Dialect/OpenACC/invalid.mlir
+++ b/mlir/test/Dialect/OpenACC/invalid.mlir
@@ -128,7 +128,7 @@ acc.update
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.update_device varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.update_device varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async = [#acc.device_type<none>]}
@@ -136,7 +136,7 @@ acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async =
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.update_device varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.update_device varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{wait attribute cannot appear with waitOperands}}
acc.update wait({%cst: index}) dataOperands(%0: memref<f32>) attributes {waitOnly = [#acc.device_type<none>]}
@@ -209,7 +209,7 @@ acc.exit_data attributes {async}
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.getdeviceptr varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.exit_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
@@ -218,7 +218,7 @@ acc.delete accPtr(%0 : memref<f32>)
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.getdeviceptr varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{wait_devnum cannot appear without waitOperands}}
acc.exit_data wait_devnum(%cst: index) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
@@ -232,7 +232,7 @@ acc.enter_data attributes {async}
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.enter_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async}
@@ -240,7 +240,7 @@ acc.enter_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {asy
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{wait attribute cannot appear with waitOperands}}
acc.enter_data wait(%cst: index) dataOperands(%0 : memref<f32>) attributes {wait}
@@ -248,7 +248,7 @@ acc.enter_data wait(%cst: index) dataOperands(%0 : memref<f32>) attributes {wait
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
// expected-error at +1 {{wait_devnum cannot appear without waitOperands}}
acc.enter_data wait_devnum(%cst: index) dataOperands(%0 : memref<f32>)
diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir
index 842f8e260c499e..f4a13bdee583ce 100644
--- a/mlir/test/Dialect/OpenACC/legalize-data.mlir
+++ b/mlir/test/Dialect/OpenACC/legalize-data.mlir
@@ -2,7 +2,7 @@
// RUN: mlir-opt -split-input-file --openacc-legalize-data-values=host-to-device=false %s | FileCheck %s --check-prefixes=CHECK,HOST
func.func @test(%a: memref<10xf32>, %i : index) {
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel dataOperands(%create : memref<10xf32>) {
%ci = memref.load %a[%i] : memref<10xf32>
acc.yield
@@ -12,7 +12,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// CHECK-LABEL: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {
// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
@@ -22,7 +22,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// -----
func.func @test(%a: memref<10xf32>, %i : index) {
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.serial dataOperands(%create : memref<10xf32>) {
%ci = memref.load %a[%i] : memref<10xf32>
acc.yield
@@ -32,7 +32,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// CHECK-LABEL: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.serial dataOperands(%[[CREATE]] : memref<10xf32>) {
// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
@@ -42,7 +42,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// -----
func.func @test(%a: memref<10xf32>, %i : index) {
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.kernels dataOperands(%create : memref<10xf32>) {
%ci = memref.load %a[%i] : memref<10xf32>
acc.terminator
@@ -52,7 +52,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// CHECK-LABEL: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.kernels dataOperands(%[[CREATE]] : memref<10xf32>) {
// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
// HOST: %{{.*}} = memref.load %[[A]][%[[I]]] : memref<10xf32>
@@ -62,7 +62,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// -----
func.func @test(%a: memref<10xf32>, %i : index) {
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.data dataOperands(%create : memref<10xf32>) {
%c0 = arith.constant 0.000000e+00 : f32
memref.store %c0, %a[%i] : memref<10xf32>
@@ -77,7 +77,7 @@ func.func @test(%a: memref<10xf32>, %i : index) {
// CHECK-LABEL: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>, %[[I:.*]]: index)
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.data dataOperands(%[[CREATE]] : memref<10xf32>) {
// CHECK: memref.store %{{.*}}, %[[A]][%[[I]]] : memref<10xf32>
// DEVICE: %{{.*}} = memref.load %[[CREATE]][%[[I]]] : memref<10xf32>
@@ -91,7 +91,7 @@ func.func @test(%a: memref<10xf32>) {
%lb = arith.constant 0 : index
%st = arith.constant 1 : index
%c10 = arith.constant 10 : index
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel dataOperands(%create : memref<10xf32>) {
acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
%ci = memref.load %a[%i] : memref<10xf32>
@@ -104,7 +104,7 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.parallel dataOperands(%[[CREATE]] : memref<10xf32>) {
// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {
// DEVICE: %{{.*}} = memref.load %[[CREATE:.*]][%[[I]]] : memref<10xf32>
@@ -129,7 +129,7 @@ func.func @test(%a: memref<10xf32>) {
%lb = arith.constant 0 : index
%st = arith.constant 1 : index
%c10 = arith.constant 10 : index
- %p1 = acc.private varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %p1 = acc.private varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) {
acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
%ci = memref.load %a[%i] : memref<10xf32>
@@ -142,7 +142,7 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
-// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.parallel private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) {
// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {
// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
@@ -167,7 +167,7 @@ func.func @test(%a: memref<10xf32>) {
%lb = arith.constant 0 : index
%st = arith.constant 1 : index
%c10 = arith.constant 10 : index
- %p1 = acc.private varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %p1 = acc.private varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel {
acc.loop private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
%ci = memref.load %a[%i] : memref<10xf32>
@@ -180,7 +180,7 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
-// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.parallel {
// CHECK: acc.loop private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {
// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
@@ -205,7 +205,7 @@ func.func @test(%a: memref<10xf32>) {
%lb = arith.constant 0 : index
%st = arith.constant 1 : index
%c10 = arith.constant 10 : index
- %p1 = acc.private varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %p1 = acc.private varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.serial private(@privatization_memref_10_f32 -> %p1 : memref<10xf32>) {
acc.loop control(%i : index) = (%lb : index) to (%c10 : index) step (%st : index) {
%ci = memref.load %a[%i] : memref<10xf32>
@@ -218,7 +218,7 @@ func.func @test(%a: memref<10xf32>) {
// CHECK: func.func @test
// CHECK-SAME: (%[[A:.*]]: memref<10xf32>)
-// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[PRIVATE:.*]] = acc.private varPtr(%[[A]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.serial private(@privatization_memref_10_f32 -> %[[PRIVATE]] : memref<10xf32>) {
// CHECK: acc.loop control(%[[I:.*]] : index) = (%{{.*}} : index) to (%{{.*}} : index) step (%{{.*}} : index) {
// DEVICE: %{{.*}} = memref.load %[[PRIVATE:.*]][%[[I]]] : memref<10xf32>
diff --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir
index 3ed81b5117f227..6a9ec518c21143 100644
--- a/mlir/test/Dialect/OpenACC/ops.mlir
+++ b/mlir/test/Dialect/OpenACC/ops.mlir
@@ -115,12 +115,12 @@ func.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10x
%numGangs = arith.constant 10 : i64
%numWorkers = arith.constant 10 : i64
- %pa = acc.present varPtr(%a : memref<10x10xf32>) -> memref<10x10xf32>
- %pb = acc.present varPtr(%b : memref<10x10xf32>) -> memref<10x10xf32>
- %pc = acc.present varPtr(%c : memref<10xf32>) -> memref<10xf32>
- %pd = acc.present varPtr(%d : memref<10xf32>) -> memref<10xf32>
+ %pa = acc.present varPtr(%a : memref<10x10xf32>, tensor<10x10xf32>) -> memref<10x10xf32>
+ %pb = acc.present varPtr(%b : memref<10x10xf32>, tensor<10x10xf32>) -> memref<10x10xf32>
+ %pc = acc.present varPtr(%c : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
+ %pd = acc.present varPtr(%d : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.data dataOperands(%pa, %pb, %pc, %pd: memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>) {
- %private = acc.private varPtr(%c : memref<10xf32>) -> memref<10xf32>
+ %private = acc.private varPtr(%c : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel num_gangs({%numGangs: i64}) num_workers(%numWorkers: i64 [#acc.device_type<nvidia>]) private(@privatization_memref_10_f32 -> %private : memref<10xf32>) {
acc.loop gang control(%x : index) = (%lb : index) to (%c10 : index) step (%st : index) {
acc.loop worker control(%y : index) = (%lb : index) to (%c10 : index) step (%st : index) {
@@ -157,7 +157,7 @@ func.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10x
// CHECK-NEXT: [[NUMGANG:%.*]] = arith.constant 10 : i64
// CHECK-NEXT: [[NUMWORKERS:%.*]] = arith.constant 10 : i64
// CHECK: acc.data dataOperands(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}} : memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>) {
-// CHECK-NEXT: %[[P_ARG2:.*]] = acc.private varPtr([[ARG2]] : memref<10xf32>) -> memref<10xf32>
+// CHECK-NEXT: %[[P_ARG2:.*]] = acc.private varPtr([[ARG2]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK-NEXT: acc.parallel num_gangs({[[NUMGANG]] : i64}) num_workers([[NUMWORKERS]] : i64 [#acc.device_type<nvidia>]) private(@privatization_memref_10_f32 -> %[[P_ARG2]] : memref<10xf32>) {
// CHECK-NEXT: acc.loop gang control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
// CHECK-NEXT: acc.loop worker control(%{{.*}}) = (%{{.*}}) to (%{{.*}}) step (%{{.*}}) {
@@ -257,7 +257,7 @@ func.func @testloopop(%a : memref<10xf32>) -> () {
"test.openacc_dummy_op"() : () -> ()
acc.yield
} attributes {inclusiveUpperbound = array<i1: true>}
- %b = acc.cache varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %b = acc.cache varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.loop cache(%b : memref<10xf32>) control(%iv : index) = (%c0 : index) to (%c10 : index) step (%c1 : index) {
"test.openacc_dummy_op"() : () -> ()
acc.yield
@@ -317,7 +317,7 @@ func.func @testloopop(%a : memref<10xf32>) -> () {
// CHECK: acc.loop gang({dim=[[I64VALUE]] : i64, static=[[I64VALUE]] : i64})
// CHECK-NEXT: "test.openacc_dummy_op"() : () -> ()
// CHECK-NEXT: acc.yield
-// CHECK: %{{.*}} = acc.cache varPtr(%{{.*}} : memref<10xf32>) -> memref<10xf32>
+// CHECK: %{{.*}} = acc.cache varPtr(%{{.*}} : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK-NEXT: acc.loop cache(%{{.*}} : memref<10xf32>)
// CHECK-NEXT: "test.openacc_dummy_op"() : () -> ()
// CHECK-NEXT: acc.yield
@@ -560,7 +560,7 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
}
acc.serial wait({%i64value : i64, %i32value : i32, %idxValue : index}) {
}
- %firstprivate = acc.firstprivate varPtr(%b : memref<10xf32>) -> memref<10xf32>
+ %firstprivate = acc.firstprivate varPtr(%b : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.serial private(@privatization_memref_10_f32 -> %a : memref<10xf32>, @privatization_memref_10_10_f32 -> %c : memref<10x10xf32>) firstprivate(@firstprivatization_memref_10xf32 -> %firstprivate : memref<10xf32>) {
}
acc.serial {
@@ -597,7 +597,7 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
// CHECK-NEXT: }
// CHECK: acc.serial wait({[[I64VALUE]] : i64, [[I32VALUE]] : i32, [[IDXVALUE]] : index}) {
// CHECK-NEXT: }
-// CHECK: %[[FIRSTP:.*]] = acc.firstprivate varPtr([[ARGB]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: %[[FIRSTP:.*]] = acc.firstprivate varPtr([[ARGB]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK: acc.serial firstprivate(@firstprivatization_memref_10xf32 -> %[[FIRSTP]] : memref<10xf32>) private(@privatization_memref_10_f32 -> [[ARGA]] : memref<10xf32>, @privatization_memref_10_10_f32 -> [[ARGC]] : memref<10x10xf32>) {
// CHECK-NEXT: }
// CHECK: acc.serial {
@@ -1069,45 +1069,45 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
%i32Value = arith.constant 1 : i32
%idxValue = arith.constant 1 : index
- %0 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%0 : !llvm.ptr)
- acc.copyout accPtr(%0 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%0 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
- %1 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %1 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%1 : !llvm.ptr)
acc.delete accPtr(%1 : !llvm.ptr)
- %2 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %2 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%2 : !llvm.ptr) attributes {async,finalize}
acc.delete accPtr(%2 : !llvm.ptr)
- %3 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %3 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%3 : !llvm.ptr)
acc.detach accPtr(%3 : !llvm.ptr)
- %4 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %4 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%4 : !llvm.ptr) attributes {async}
- acc.copyout accPtr(%4 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%4 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
- %5 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %5 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%5 : !llvm.ptr) attributes {wait}
acc.delete accPtr(%5 : !llvm.ptr)
- %6 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %6 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data async(%i64Value : i64) dataOperands(%6 : !llvm.ptr)
- acc.copyout accPtr(%6 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%6 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
- %7 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %7 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data dataOperands(%7 : !llvm.ptr) async(%i64Value : i64)
- acc.copyout accPtr(%7 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%7 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
- %8 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %8 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data if(%ifCond) dataOperands(%8 : !llvm.ptr)
- acc.copyout accPtr(%8 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%8 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
- %9 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %9 = acc.getdeviceptr varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.exit_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) dataOperands(%9 : !llvm.ptr)
- acc.copyout accPtr(%9 : !llvm.ptr) to varPtr(%a : !llvm.ptr)
+ acc.copyout accPtr(%9 : !llvm.ptr) to varPtr(%a : !llvm.ptr, f64)
return
}
@@ -1118,45 +1118,45 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
// CHECK: %[[I32VALUE:.*]] = arith.constant 1 : i32
// CHECK: %[[IDXVALUE:.*]] = arith.constant 1 : index
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {async, finalize}
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr)
// CHECK: acc.detach accPtr(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {async}
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {wait}
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data async(%[[I64VALUE]] : i64) dataOperands(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data async(%[[I64VALUE]] : i64) dataOperands(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data if(%[[IFCOND]]) dataOperands(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
-// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.exit_data wait_devnum(%[[I64VALUE]] : i64) wait(%[[I32VALUE]], %[[IDXVALUE]] : i32, index) dataOperands(%[[DEVPTR]] : !llvm.ptr)
-// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr)
+// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr, f64)
// -----
@@ -1167,25 +1167,25 @@ func.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !llvm.ptr) -> () {
%i32Value = arith.constant 1 : i32
%idxValue = arith.constant 1 : index
- %0 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data dataOperands(%0 : !llvm.ptr)
- %1 = acc.create varPtr(%a : !llvm.ptr) -> !llvm.ptr
- %2 = acc.create varPtr(%b : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
- %3 = acc.create varPtr(%c : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
+ %1 = acc.create varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
+ %2 = acc.create varPtr(%b : !llvm.ptr, f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
+ %3 = acc.create varPtr(%c : !llvm.ptr, f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
acc.enter_data dataOperands(%1, %2, %3 : !llvm.ptr, !llvm.ptr, !llvm.ptr)
- %4 = acc.attach varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %4 = acc.attach varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data dataOperands(%4 : !llvm.ptr)
- %5 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %5 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data dataOperands(%5 : !llvm.ptr) attributes {async}
- %6 = acc.create varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %6 = acc.create varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data dataOperands(%6 : !llvm.ptr) attributes {wait}
- %7 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %7 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data async(%i64Value : i64) dataOperands(%7 : !llvm.ptr)
- %8 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %8 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data dataOperands(%8 : !llvm.ptr) async(%i64Value : i64)
- %9 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %9 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data if(%ifCond) dataOperands(%9 : !llvm.ptr)
- %10 = acc.copyin varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %10 = acc.copyin varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.enter_data wait_devnum(%i64Value: i64) wait(%i32Value, %idxValue : i32, index) dataOperands(%10 : !llvm.ptr)
return
@@ -1196,72 +1196,72 @@ func.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !llvm.ptr) -> () {
// CHECK: [[I64VALUE:%.*]] = arith.constant 1 : i64
// CHECK: [[I32VALUE:%.*]] = arith.constant 1 : i32
// CHECK: [[IDXVALUE:%.*]] = arith.constant 1 : index
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr)
-// CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
-// CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
-// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
+// CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
+// CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : !llvm.ptr, f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
+// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr, f64) -> !llvm.ptr {dataClause = #acc<data_clause acc_create_zero>}
// CHECK: acc.enter_data dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !llvm.ptr, !llvm.ptr, !llvm.ptr)
-// CHECK: %[[ATTACH:.*]] = acc.attach varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[ATTACH:.*]] = acc.attach varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data dataOperands(%[[ATTACH]] : !llvm.ptr)
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr) attributes {async}
-// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[CREATE:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data dataOperands(%[[CREATE]] : !llvm.ptr) attributes {wait}
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr)
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data async([[I64VALUE]] : i64) dataOperands(%[[COPYIN]] : !llvm.ptr)
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data if([[IFCOND]]) dataOperands(%[[COPYIN]] : !llvm.ptr)
-// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[COPYIN:.*]] = acc.copyin varPtr(%[[ARGA]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.enter_data wait_devnum([[I64VALUE]] : i64) wait([[I32VALUE]], [[IDXVALUE]] : i32, index) dataOperands(%[[COPYIN]] : !llvm.ptr)
// -----
func.func @teststructureddataclauseops(%a: memref<10xf32>, %b: memref<memref<10xf32>>, %c: memref<10x20xf32>) -> () {
- %deviceptr = acc.deviceptr varPtr(%a : memref<10xf32>) -> memref<10xf32> {name = "arrayA"}
+ %deviceptr = acc.deviceptr varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {name = "arrayA"}
acc.parallel dataOperands(%deviceptr : memref<10xf32>) {
}
- %present = acc.present varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %present = acc.present varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.data dataOperands(%present : memref<10xf32>) {
}
- %copyin = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32>
+ %copyin = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.parallel dataOperands(%copyin : memref<10xf32>) {
}
- %copyinreadonly = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
+ %copyinreadonly = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
acc.kernels dataOperands(%copyinreadonly : memref<10xf32>) {
}
- %copyinfromcopy = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+ %copyinfromcopy = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
acc.serial dataOperands(%copyinfromcopy : memref<10xf32>) {
}
- acc.copyout accPtr(%copyinfromcopy : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+ acc.copyout accPtr(%copyinfromcopy : memref<10xf32>) to varPtr(%a : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
- %create = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32>
- %createimplicit = acc.create varPtr(%c : memref<10x20xf32>) -> memref<10x20xf32> {implicit = true}
+ %create = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
+ %createimplicit = acc.create varPtr(%c : memref<10x20xf32>, tensor<10x20xf32>) -> memref<10x20xf32> {implicit = true}
acc.parallel dataOperands(%create, %createimplicit : memref<10xf32>, memref<10x20xf32>) {
}
acc.delete accPtr(%create : memref<10xf32>) {dataClause = #acc<data_clause acc_create>}
acc.delete accPtr(%createimplicit : memref<10x20xf32>) {dataClause = #acc<data_clause acc_create>, implicit = true}
- %copyoutzero = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
+ %copyoutzero = acc.create varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
acc.parallel dataOperands(%copyoutzero: memref<10xf32>) {
}
- acc.copyout accPtr(%copyoutzero : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
+ acc.copyout accPtr(%copyoutzero : memref<10xf32>) to varPtr(%a : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
%attach = acc.attach varPtr(%b : memref<memref<10xf32>>) -> memref<memref<10xf32>>
acc.parallel dataOperands(%attach : memref<memref<10xf32>>) {
}
acc.detach accPtr(%attach : memref<memref<10xf32>>) {dataClause = #acc<data_clause acc_attach>}
- %copyinparent = acc.copyin varPtr(%a : memref<10xf32>) varPtrPtr(%b : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+ %copyinparent = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) varPtrPtr(%b : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
acc.parallel dataOperands(%copyinparent : memref<10xf32>) {
}
- acc.copyout accPtr(%copyinparent : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+ acc.copyout accPtr(%copyinparent : memref<10xf32>) to varPtr(%a : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
%c0 = arith.constant 0 : index
%c1 = arith.constant 1 : index
@@ -1271,93 +1271,93 @@ func.func @teststructureddataclauseops(%a: memref<10xf32>, %b: memref<memref<10x
%c20 = arith.constant 20 : index
%bounds1full = acc.bounds lowerbound(%c0 : index) upperbound(%c9 : index) stride(%c1 : index)
- %copyinfullslice1 = acc.copyin varPtr(%a : memref<10xf32>) bounds(%bounds1full) -> memref<10xf32> {name = "arrayA[0:9]"}
+ %copyinfullslice1 = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) bounds(%bounds1full) -> memref<10xf32> {name = "arrayA[0:9]"}
// Specify full-bounds but assume that startIdx of array reference is 1.
%bounds2full = acc.bounds lowerbound(%c1 : index) upperbound(%c20 : index) extent(%c20 : index) stride(%c4 : index) startIdx(%c1 : index) {strideInBytes = true}
- %copyinfullslice2 = acc.copyin varPtr(%c : memref<10x20xf32>) bounds(%bounds1full, %bounds2full) -> memref<10x20xf32>
+ %copyinfullslice2 = acc.copyin varPtr(%c : memref<10x20xf32>, tensor<10x20xf32>) bounds(%bounds1full, %bounds2full) -> memref<10x20xf32>
acc.parallel dataOperands(%copyinfullslice1, %copyinfullslice2 : memref<10xf32>, memref<10x20xf32>) {
}
%bounds1partial = acc.bounds lowerbound(%c4 : index) upperbound(%c9 : index) stride(%c1 : index)
- %copyinpartial = acc.copyin varPtr(%a : memref<10xf32>) bounds(%bounds1partial) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+ %copyinpartial = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) bounds(%bounds1partial) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
acc.parallel dataOperands(%copyinpartial : memref<10xf32>) {
}
- acc.copyout accPtr(%copyinpartial : memref<10xf32>) bounds(%bounds1partial) to varPtr(%a : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+ acc.copyout accPtr(%copyinpartial : memref<10xf32>) bounds(%bounds1partial) to varPtr(%a : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
return
}
// CHECK: func.func @teststructureddataclauseops([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref<memref<10xf32>>, [[ARGC:%.*]]: memref<10x20xf32>) {
-// CHECK: [[DEVICEPTR:%.*]] = acc.deviceptr varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {name = "arrayA"}
+// CHECK: [[DEVICEPTR:%.*]] = acc.deviceptr varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {name = "arrayA"}
// CHECK-NEXT: acc.parallel dataOperands([[DEVICEPTR]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK: [[PRESENT:%.*]] = acc.present varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: [[PRESENT:%.*]] = acc.present varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK-NEXT: acc.data dataOperands([[PRESENT]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32>
+// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
// CHECK-NEXT: acc.parallel dataOperands([[COPYIN]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK: [[COPYINRO:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
+// CHECK: [[COPYINRO:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyin_readonly>}
// CHECK-NEXT: acc.kernels dataOperands([[COPYINRO]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK: [[COPYINCOPY:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+// CHECK: [[COPYINCOPY:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
// CHECK-NEXT: acc.serial dataOperands([[COPYINCOPY]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK-NEXT: acc.copyout accPtr([[COPYINCOPY]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
-// CHECK: [[CREATE:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32>
-// CHECK-NEXT: [[CREATEIMP:%.*]] = acc.create varPtr([[ARGC]] : memref<10x20xf32>) -> memref<10x20xf32> {implicit = true}
+// CHECK-NEXT: acc.copyout accPtr([[COPYINCOPY]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+// CHECK: [[CREATE:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
+// CHECK-NEXT: [[CREATEIMP:%.*]] = acc.create varPtr([[ARGC]] : memref<10x20xf32>, tensor<10x20xf32>) -> memref<10x20xf32> {implicit = true}
// CHECK-NEXT: acc.parallel dataOperands([[CREATE]], [[CREATEIMP]] : memref<10xf32>, memref<10x20xf32>) {
// CHECK-NEXT: }
// CHECK-NEXT: acc.delete accPtr([[CREATE]] : memref<10xf32>) {dataClause = #acc<data_clause acc_create>}
// CHECK-NEXT: acc.delete accPtr([[CREATEIMP]] : memref<10x20xf32>) {dataClause = #acc<data_clause acc_create>, implicit = true}
-// CHECK: [[COPYOUTZ:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
+// CHECK: [[COPYOUTZ:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout_zero>}
// CHECK-NEXT: acc.parallel dataOperands([[COPYOUTZ]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK-NEXT: acc.copyout accPtr([[COPYOUTZ]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
+// CHECK-NEXT: acc.copyout accPtr([[COPYOUTZ]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copyout_zero>}
// CHECK: [[ATTACH:%.*]] = acc.attach varPtr([[ARGB]] : memref<memref<10xf32>>) -> memref<memref<10xf32>>
// CHECK-NEXT: acc.parallel dataOperands([[ATTACH]] : memref<memref<10xf32>>) {
// CHECK-NEXT: }
// CHECK-NEXT: acc.detach accPtr([[ATTACH]] : memref<memref<10xf32>>) {dataClause = #acc<data_clause acc_attach>}
-// CHECK: [[COPYINP:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varPtrPtr([[ARGB]] : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+// CHECK: [[COPYINP:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) varPtrPtr([[ARGB]] : memref<memref<10xf32>>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
// CHECK-NEXT: acc.parallel dataOperands([[COPYINP]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK-NEXT: acc.copyout accPtr([[COPYINP]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+// CHECK-NEXT: acc.copyout accPtr([[COPYINP]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
// CHECK-DAG: [[CON0:%.*]] = arith.constant 0 : index
// CHECK-DAG: [[CON1:%.*]] = arith.constant 1 : index
// CHECK-DAG: [[CON4:%.*]] = arith.constant 4 : index
// CHECK-DAG: [[CON9:%.*]] = arith.constant 9 : index
// CHECK-DAG: [[CON20:%.*]] = arith.constant 20 : index
// CHECK: [[BOUNDS1F:%.*]] = acc.bounds lowerbound([[CON0]] : index) upperbound([[CON9]] : index) stride([[CON1]] : index)
-// CHECK-NEXT: [[COPYINF1:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) bounds([[BOUNDS1F]]) -> memref<10xf32> {name = "arrayA[0:9]"}
+// CHECK-NEXT: [[COPYINF1:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) bounds([[BOUNDS1F]]) -> memref<10xf32> {name = "arrayA[0:9]"}
// CHECK-NEXT: [[BOUNDS2F:%.*]] = acc.bounds lowerbound([[CON1]] : index) upperbound([[CON20]] : index) extent([[CON20]] : index) stride([[CON4]] : index) startIdx([[CON1]] : index) {strideInBytes = true}
-// CHECK-NEXT: [[COPYINF2:%.*]] = acc.copyin varPtr([[ARGC]] : memref<10x20xf32>) bounds([[BOUNDS1F]], [[BOUNDS2F]]) -> memref<10x20xf32>
+// CHECK-NEXT: [[COPYINF2:%.*]] = acc.copyin varPtr([[ARGC]] : memref<10x20xf32>, tensor<10x20xf32>) bounds([[BOUNDS1F]], [[BOUNDS2F]]) -> memref<10x20xf32>
// CHECK-NEXT: acc.parallel dataOperands([[COPYINF1]], [[COPYINF2]] : memref<10xf32>, memref<10x20xf32>) {
// CHECK-NEXT: }
// CHECK: [[BOUNDS1P:%.*]] = acc.bounds lowerbound([[CON4]] : index) upperbound([[CON9]] : index) stride([[CON1]] : index)
-// CHECK-NEXT: [[COPYINPART:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) bounds([[BOUNDS1P]]) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
+// CHECK-NEXT: [[COPYINPART:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) bounds([[BOUNDS1P]]) -> memref<10xf32> {dataClause = #acc<data_clause acc_copy>}
// CHECK-NEXT: acc.parallel dataOperands([[COPYINPART]] : memref<10xf32>) {
// CHECK-NEXT: }
-// CHECK-NEXT: acc.copyout accPtr([[COPYINPART]] : memref<10xf32>) bounds([[BOUNDS1P]]) to varPtr([[ARGA]] : memref<10xf32>) {dataClause = #acc<data_clause acc_copy>}
+// CHECK-NEXT: acc.copyout accPtr([[COPYINPART]] : memref<10xf32>) bounds([[BOUNDS1P]]) to varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) {dataClause = #acc<data_clause acc_copy>}
// -----
func.func @testunstructuredclauseops(%a: memref<10xf32>) -> () {
- %copyin = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {structured = false}
+ %copyin = acc.copyin varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {structured = false}
acc.enter_data dataOperands(%copyin : memref<10xf32>)
- %devptr = acc.getdeviceptr varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
+ %devptr = acc.getdeviceptr varPtr(%a : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
acc.exit_data dataOperands(%devptr : memref<10xf32>)
- acc.copyout accPtr(%devptr : memref<10xf32>) to varPtr(%a : memref<10xf32>) {structured = false}
+ acc.copyout accPtr(%devptr : memref<10xf32>) to varPtr(%a : memref<10xf32>, tensor<10xf32>) {structured = false}
return
}
// CHECK: func.func @testunstructuredclauseops([[ARGA:%.*]]: memref<10xf32>) {
-// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {structured = false}
+// CHECK: [[COPYIN:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {structured = false}
// CHECK-NEXT: acc.enter_data dataOperands([[COPYIN]] : memref<10xf32>)
-// CHECK: [[DEVPTR:%.*]] = acc.getdeviceptr varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
+// CHECK: [[DEVPTR:%.*]] = acc.getdeviceptr varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) -> memref<10xf32> {dataClause = #acc<data_clause acc_copyout>}
// CHECK-NEXT: acc.exit_data dataOperands([[DEVPTR]] : memref<10xf32>)
-// CHECK-NEXT: acc.copyout accPtr([[DEVPTR]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) {structured = false}
+// CHECK-NEXT: acc.copyout accPtr([[DEVPTR]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>, tensor<10xf32>) {structured = false}
// -----
@@ -1382,7 +1382,7 @@ func.func @host_device_ops(%a: memref<f32>) -> () {
// -----
func.func @host_data_ops(%a: !llvm.ptr, %ifCond: i1) -> () {
- %0 = acc.use_device varPtr(%a : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.use_device varPtr(%a : !llvm.ptr, f64) -> !llvm.ptr
acc.host_data dataOperands(%0: !llvm.ptr) {
}
acc.host_data dataOperands(%0: !llvm.ptr) {
@@ -1394,7 +1394,7 @@ func.func @host_data_ops(%a: !llvm.ptr, %ifCond: i1) -> () {
// CHECK-LABEL: func.func @host_data_ops(
// CHECK-SAME: %[[A:.*]]: !llvm.ptr, %[[IFCOND:.*]]: i1)
-// CHECK: %[[PTR:.*]] = acc.use_device varPtr(%[[A]] : !llvm.ptr) -> !llvm.ptr
+// CHECK: %[[PTR:.*]] = acc.use_device varPtr(%[[A]] : !llvm.ptr, f64) -> !llvm.ptr
// CHECK: acc.host_data dataOperands(%[[PTR]] : !llvm.ptr)
// CHECK: acc.host_data dataOperands(%[[PTR]] : !llvm.ptr) {
// CHECK: } attributes {if_present}
@@ -1583,14 +1583,14 @@ llvm.mlir.global external @globalvar() { acc.declare = #acc.declare<dataClause =
acc.global_ctor @acc_constructor {
%0 = llvm.mlir.addressof @globalvar { acc.declare = #acc.declare<dataClause = acc_create> } : !llvm.ptr
- %1 = acc.create varPtr(%0 : !llvm.ptr) -> !llvm.ptr
+ %1 = acc.create varPtr(%0 : !llvm.ptr, i32) -> !llvm.ptr
acc.declare_enter dataOperands(%1 : !llvm.ptr)
acc.terminator
}
acc.global_dtor @acc_destructor {
%0 = llvm.mlir.addressof @globalvar { acc.declare = #acc.declare<dataClause = acc_create> } : !llvm.ptr
- %1 = acc.getdeviceptr varPtr(%0 : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
+ %1 = acc.getdeviceptr varPtr(%0 : !llvm.ptr, i32) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
acc.declare_exit dataOperands(%1 : !llvm.ptr)
acc.delete accPtr(%1 : !llvm.ptr)
acc.terminator
@@ -1598,11 +1598,11 @@ acc.global_dtor @acc_destructor {
// CHECK-LABEL: acc.global_ctor @acc_constructor
// CHECK: %[[ADDR:.*]] = llvm.mlir.addressof @globalvar {acc.declare = #acc.declare<dataClause = acc_create>} : !llvm.ptr
-// CHECK-NEXT: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !llvm.ptr) -> !llvm.ptr
+// CHECK-NEXT: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !llvm.ptr, i32) -> !llvm.ptr
// CHECK-NEXT: acc.declare_enter dataOperands(%[[CREATE]] : !llvm.ptr)
// CHECK: acc.global_dtor @acc_destructor
// CHECK: %[[ADDR:.*]] = llvm.mlir.addressof @globalvar {acc.declare = #acc.declare<dataClause = acc_create>} : !llvm.ptr
-// CHECK-NEXT: %[[DELETE:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !llvm.ptr) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
+// CHECK-NEXT: %[[DELETE:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !llvm.ptr, i32) -> !llvm.ptr {dataClause = #acc<data_clause acc_create>}
// CHECK-NEXT: acc.declare_exit dataOperands(%[[DELETE]] : !llvm.ptr)
// CHECK-NEXT: acc.delete accPtr(%[[DELETE]] : !llvm.ptr)
@@ -1657,12 +1657,12 @@ func.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10x
%c20 = arith.constant 20 : i32
%alloc = llvm.alloca %c20 x i32 { acc.declare = #acc.declare<dataClause = acc_create, implicit = true> } : (i32) -> !llvm.ptr
- %createlocal = acc.create varPtr(%alloc : !llvm.ptr) -> !llvm.ptr {implicit = true}
+ %createlocal = acc.create varPtr(%alloc : !llvm.ptr, !llvm.array<20 x i32>) -> !llvm.ptr {implicit = true}
- %pa = acc.present varPtr(%a : memref<10x10xf32>) -> memref<10x10xf32>
- %pb = acc.present varPtr(%b : memref<10x10xf32>) -> memref<10x10xf32>
- %pc = acc.present varPtr(%c : memref<10xf32>) -> memref<10xf32>
- %pd = acc.present varPtr(%d : memref<10xf32>) -> memref<10xf32>
+ %pa = acc.present varPtr(%a : memref<10x10xf32>, tensor<10x10xf32>) -> memref<10x10xf32>
+ %pb = acc.present varPtr(%b : memref<10x10xf32>, tensor<10x10xf32>) -> memref<10x10xf32>
+ %pc = acc.present varPtr(%c : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
+ %pd = acc.present varPtr(%d : memref<10xf32>, tensor<10xf32>) -> memref<10xf32>
acc.declare dataOperands(%pa, %pb, %pc, %pd, %createlocal: memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>, !llvm.ptr) {
}
diff --git a/mlir/test/Target/LLVMIR/openacc-llvm.mlir b/mlir/test/Target/LLVMIR/openacc-llvm.mlir
index 897311c6e81bea..e70e1369653f58 100644
--- a/mlir/test/Target/LLVMIR/openacc-llvm.mlir
+++ b/mlir/test/Target/LLVMIR/openacc-llvm.mlir
@@ -1,8 +1,8 @@
// RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
llvm.func @testenterdataop(%arg0: !llvm.ptr, %arg1 : !llvm.ptr) {
- %0 = acc.create varPtr(%arg0 : !llvm.ptr) -> !llvm.ptr
- %1 = acc.copyin varPtr(%arg1 : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.create varPtr(%arg0 : !llvm.ptr, f32) -> !llvm.ptr
+ %1 = acc.copyin varPtr(%arg1 : !llvm.ptr, f32) -> !llvm.ptr
acc.enter_data dataOperands(%0, %1 : !llvm.ptr, !llvm.ptr)
llvm.return
}
@@ -48,11 +48,11 @@ llvm.func @testenterdataop(%arg0: !llvm.ptr, %arg1 : !llvm.ptr) {
llvm.func @testexitdataop(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
- %arg0_devptr = acc.getdeviceptr varPtr(%arg0 : !llvm.ptr) -> !llvm.ptr
- %1 = acc.getdeviceptr varPtr(%arg1 : !llvm.ptr) -> !llvm.ptr
+ %arg0_devptr = acc.getdeviceptr varPtr(%arg0 : !llvm.ptr, f32) -> !llvm.ptr
+ %1 = acc.getdeviceptr varPtr(%arg1 : !llvm.ptr, f32) -> !llvm.ptr
acc.exit_data dataOperands(%arg0_devptr, %1 : !llvm.ptr, !llvm.ptr)
acc.delete accPtr(%arg0_devptr : !llvm.ptr)
- acc.copyout accPtr(%1 : !llvm.ptr) to varPtr(%arg1 : !llvm.ptr)
+ acc.copyout accPtr(%1 : !llvm.ptr) to varPtr(%arg1 : !llvm.ptr, f32)
llvm.return
}
@@ -95,7 +95,7 @@ llvm.func @testexitdataop(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
// -----
llvm.func @testupdateop(%arg1: !llvm.ptr) {
- %0 = acc.update_device varPtr(%arg1 : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.update_device varPtr(%arg1 : !llvm.ptr, f32) -> !llvm.ptr
acc.update dataOperands(%0 : !llvm.ptr)
llvm.return
}
@@ -132,15 +132,15 @@ llvm.func @testupdateop(%arg1: !llvm.ptr) {
llvm.func @testdataop(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) {
- %0 = acc.copyin varPtr(%arg0 : !llvm.ptr) -> !llvm.ptr
- %1 = acc.create varPtr(%arg1 : !llvm.ptr) -> !llvm.ptr
+ %0 = acc.copyin varPtr(%arg0 : !llvm.ptr, f32) -> !llvm.ptr
+ %1 = acc.create varPtr(%arg1 : !llvm.ptr, f32) -> !llvm.ptr
acc.data dataOperands(%0, %1 : !llvm.ptr, !llvm.ptr) {
%9 = llvm.mlir.constant(2 : i32) : i32
llvm.store %9, %arg2 : i32, !llvm.ptr
acc.terminator
}
- acc.copyout accPtr(%0 : !llvm.ptr) to varPtr(%arg0 : !llvm.ptr)
- acc.copyout accPtr(%1 : !llvm.ptr) to varPtr(%arg1 : !llvm.ptr)
+ acc.copyout accPtr(%0 : !llvm.ptr) to varPtr(%arg0 : !llvm.ptr, f32)
+ acc.copyout accPtr(%1 : !llvm.ptr) to varPtr(%arg1 : !llvm.ptr, f32)
llvm.return
}
>From 74393cbb0383742af092d7e992fbdd6e5bf6be8e Mon Sep 17 00:00:00 2001
From: Razvan Lupusoru <rlupusoru at nvidia.com>
Date: Fri, 6 Dec 2024 10:45:12 -0800
Subject: [PATCH 2/2] Restore acc memref tests which do not need to provide
varType
---
.../OpenACCToSCF/convert-openacc-to-scf.mlir | 18 ++++++------
mlir/test/Dialect/OpenACC/canonicalize.mlir | 28 +++++++++----------
mlir/test/Dialect/OpenACC/invalid.mlir | 14 +++++-----
3 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
index d83baf3df114bf..d8e89f64f8bc04 100644
--- a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
+++ b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
@@ -1,7 +1,7 @@
// RUN: mlir-opt %s -convert-openacc-to-scf -split-input-file | FileCheck %s
func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -14,7 +14,7 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -28,7 +28,7 @@ func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.update_device varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.update_device varPtr(%a : memref<f32>) -> memref<f32>
acc.update if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -42,7 +42,7 @@ func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
func.func @update_true(%arg0: memref<f32>) {
%true = arith.constant true
- %0 = acc.update_device varPtr(%arg0 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.update_device varPtr(%arg0 : memref<f32>) -> memref<f32>
acc.update if(%true) dataOperands(%0 : memref<f32>)
return
}
@@ -55,7 +55,7 @@ func.func @update_true(%arg0: memref<f32>) {
func.func @update_false(%arg0: memref<f32>) {
%false = arith.constant false
- %0 = acc.update_device varPtr(%arg0 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.update_device varPtr(%arg0 : memref<f32>) -> memref<f32>
acc.update if(%false) dataOperands(%0 : memref<f32>)
return
}
@@ -67,7 +67,7 @@ func.func @update_false(%arg0: memref<f32>) {
func.func @enter_data_true(%d1 : memref<f32>) {
%true = arith.constant true
- %0 = acc.create varPtr(%d1 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%d1 : memref<f32>) -> memref<f32>
acc.enter_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
return
}
@@ -80,7 +80,7 @@ func.func @enter_data_true(%d1 : memref<f32>) {
func.func @enter_data_false(%d1 : memref<f32>) {
%false = arith.constant false
- %0 = acc.create varPtr(%d1 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%d1 : memref<f32>) -> memref<f32>
acc.enter_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
return
}
@@ -92,7 +92,7 @@ func.func @enter_data_false(%d1 : memref<f32>) {
func.func @exit_data_true(%d1 : memref<f32>) {
%true = arith.constant true
- %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
acc.exit_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
return
@@ -106,7 +106,7 @@ func.func @exit_data_true(%d1 : memref<f32>) {
func.func @exit_data_false(%d1 : memref<f32>) {
%false = arith.constant false
- %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
acc.exit_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
return
diff --git a/mlir/test/Dialect/OpenACC/canonicalize.mlir b/mlir/test/Dialect/OpenACC/canonicalize.mlir
index c5272f579c1d23..e43a27f6b9e89a 100644
--- a/mlir/test/Dialect/OpenACC/canonicalize.mlir
+++ b/mlir/test/Dialect/OpenACC/canonicalize.mlir
@@ -2,7 +2,7 @@
func.func @testenterdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant true
- %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -13,7 +13,7 @@ func.func @testenterdataop(%a: memref<f32>) -> () {
func.func @testenterdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant false
- %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -25,7 +25,7 @@ func.func @testenterdataop(%a: memref<f32>) -> () {
func.func @testexitdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant true
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -37,7 +37,7 @@ func.func @testexitdataop(%a: memref<f32>) -> () {
func.func @testexitdataop(%a: memref<f32>) -> () {
%ifCond = arith.constant false
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -49,8 +49,8 @@ func.func @testexitdataop(%a: memref<f32>) -> () {
// -----
func.func @testupdateop(%a: memref<f32>) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
%ifCond = arith.constant true
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
@@ -61,8 +61,8 @@ func.func @testupdateop(%a: memref<f32>) -> () {
// -----
func.func @testupdateop(%a: memref<f32>) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
%ifCond = arith.constant false
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
@@ -74,7 +74,7 @@ func.func @testupdateop(%a: memref<f32>) -> () {
// -----
func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.create varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.create varPtr(%a : memref<f32>) -> memref<f32>
acc.enter_data if(%ifCond) dataOperands(%0 : memref<f32>)
return
}
@@ -85,7 +85,7 @@ func.func @testenterdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
acc.exit_data if(%ifCond) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
@@ -97,8 +97,8 @@ func.func @testexitdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.getdeviceptr varPtr(%a : memref<f32>, f32) -> memref<f32>
- acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>, f32)
+ %0 = acc.getdeviceptr varPtr(%a : memref<f32>) -> memref<f32>
+ acc.update_host accPtr(%0 : memref<f32>) to varPtr(%a : memref<f32>)
acc.update if(%ifCond) dataOperands(%0: memref<f32>)
return
}
@@ -109,7 +109,7 @@ func.func @testupdateop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.use_device varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
%1 = arith.constant 1 : i32
%2 = arith.constant 10 : i32
%false = arith.constant false
@@ -135,7 +135,7 @@ func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
// -----
func.func @testhostdataop(%a: memref<f32>, %ifCond: i1) -> () {
- %0 = acc.use_device varPtr(%a : memref<f32>, f32) -> memref<f32>
+ %0 = acc.use_device varPtr(%a : memref<f32>) -> memref<f32>
%true = arith.constant true
acc.host_data dataOperands(%0 : memref<f32>) if(%true) {
}
diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir
index a0ba873c73ff19..0cc65f7b30d98d 100644
--- a/mlir/test/Dialect/OpenACC/invalid.mlir
+++ b/mlir/test/Dialect/OpenACC/invalid.mlir
@@ -128,7 +128,7 @@ acc.update
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.update_device varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.update_device varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async = [#acc.device_type<none>]}
@@ -136,7 +136,7 @@ acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async =
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.update_device varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.update_device varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{wait attribute cannot appear with waitOperands}}
acc.update wait({%cst: index}) dataOperands(%0: memref<f32>) attributes {waitOnly = [#acc.device_type<none>]}
@@ -209,7 +209,7 @@ acc.exit_data attributes {async}
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.getdeviceptr varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.exit_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async}
acc.delete accPtr(%0 : memref<f32>)
@@ -218,7 +218,7 @@ acc.delete accPtr(%0 : memref<f32>)
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.getdeviceptr varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.getdeviceptr varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{wait_devnum cannot appear without waitOperands}}
acc.exit_data wait_devnum(%cst: index) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
@@ -232,7 +232,7 @@ acc.enter_data attributes {async}
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{async attribute cannot appear with asyncOperand}}
acc.enter_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async}
@@ -240,7 +240,7 @@ acc.enter_data async(%cst: index) dataOperands(%0 : memref<f32>) attributes {asy
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{wait attribute cannot appear with waitOperands}}
acc.enter_data wait(%cst: index) dataOperands(%0 : memref<f32>) attributes {wait}
@@ -248,7 +248,7 @@ acc.enter_data wait(%cst: index) dataOperands(%0 : memref<f32>) attributes {wait
%cst = arith.constant 1 : index
%value = memref.alloc() : memref<f32>
-%0 = acc.create varPtr(%value : memref<f32>, f32) -> memref<f32>
+%0 = acc.create varPtr(%value : memref<f32>) -> memref<f32>
// expected-error at +1 {{wait_devnum cannot appear without waitOperands}}
acc.enter_data wait_devnum(%cst: index) dataOperands(%0 : memref<f32>)
More information about the flang-commits
mailing list