diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp index 878dccc4ecbc4..75dcf6ec3e110 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(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 || std::is_same_v) builder.create(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) builder.create( 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 8d7e27405cfa4..3ac265ac68756 100644 --- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td @@ -381,17 +381,18 @@ class OpenACC_DataEntryOp]>])> { - let arguments = !con(additionalArgs, - (ins - Optional:$varPtrPtr, - Variadic:$bounds, /* rank-0 to rank-{n-1} */ - Variadic:$asyncOperands, - OptionalAttr:$asyncOperandsDeviceType, - OptionalAttr:$asyncOnly, - DefaultValuedAttr:$dataClause, - DefaultValuedAttr:$structured, - DefaultValuedAttr:$implicit, - OptionalAttr:$name)); + let arguments = !con( + additionalArgs, + (ins TypeAttr:$varType, + Optional:$varPtrPtr, + Variadic:$bounds, /* rank-0 to rank-{n-1} */ + Variadic:$asyncOperands, + OptionalAttr:$asyncOperandsDeviceType, + OptionalAttr:$asyncOnly, + DefaultValuedAttr:$dataClause, + DefaultValuedAttr:$structured, + DefaultValuedAttr:$implicit, + OptionalAttr:$name)); let description = !strconcat(extraDescription, [{ Description of arguments: @@ -458,7 +459,7 @@ class OpenACC_DataEntryOp(type($varPtr), $varType) oilist( `varPtrPtr` `(` $varPtrPtr `:` type($varPtrPtr) `)` | `bounds` `(` $bounds `)` @@ -469,32 +470,35 @@ class OpenACC_DataEntryOp:$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($asyncOperands, - type($asyncOperands), $asyncOperandsDeviceType) `)` - ) attr-dict - }]; - let hasVerifier = 1; } -class OpenACC_DataExitOpWithVarPtr : - OpenACC_DataExitOp, - MemWrite]>], - (ins Arg:$accPtr, - Arg:$varPtr)> { +class OpenACC_DataExitOpWithVarPtr + : OpenACC_DataExitOp< + mnemonic, clause, + "- `varPtr`: The address of variable to copy back to.", + [MemoryEffects<[MemRead, + MemWrite]>], + (ins Arg:$accPtr, + Arg:$varPtr, + TypeAttr:$varType)> { let assemblyFormat = [{ `accPtr` `(` $accPtr `:` type($accPtr) `)` (`bounds` `(` $bounds^ `)` )? (`async` `(` custom($asyncOperands, type($asyncOperands), $asyncOperandsDeviceType)^ `)`)? - `to` `varPtr` `(` $varPtr `:` type($varPtr) `)` + `to` `varPtr` `(` $varPtr `:` custom(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 : diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp index 280260e0485bb..d490376db0e7f 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,48 @@ static LogicalResult checkWaitAndAsyncConflict(Op op) { return success(); } +static ParseResult parseVarPtrType(mlir::OpAsmParser &parser, + mlir::Type &varPtrType, + mlir::TypeAttr &varTypeAttr) { + if (failed(parser.parseType(varPtrType))) + return failure(); + if (failed(parser.parseRParen())) + return failure(); + + if (succeeded(parser.parseOptionalKeyword("varType"))) { + if (failed(parser.parseLParen())) + return failure(); + mlir::Type varType; + if (failed(parser.parseType(varType))) + return failure(); + varTypeAttr = mlir::TypeAttr::get(varType); + if (failed(parser.parseRParen())) + return failure(); + } else { + // Set `varType` from the element type of the type of `varPtr`. + varTypeAttr = mlir::TypeAttr::get( + mlir::cast(varPtrType).getElementType()); + } + + return success(); +} + +static void printVarPtrType(mlir::OpAsmPrinter &p, mlir::Operation *op, + mlir::Type varPtrType, mlir::TypeAttr varTypeAttr) { + p.printType(varPtrType); + p << ")"; + + // Print the `varType` only if it differs from the element type of + // `varPtr`'s type. + mlir::Type varType = varTypeAttr.getValue(); + if (mlir::cast(varPtrType).getElementType() != + varType) { + p << " varType("; + p.printType(varType); + p << ")"; + } +} + //===----------------------------------------------------------------------===// // DataBoundsOp //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/OpenACC/legalize-data.mlir b/mlir/test/Dialect/OpenACC/legalize-data.mlir index 842f8e260c499..baa72ae416c92 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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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>) varType(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 3ed81b5117f22..2706792a263a8 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>) varType(tensor<10x10xf32>) -> memref<10x10xf32> + %pb = acc.present varPtr(%b : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32> + %pc = acc.present varPtr(%c : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> + %pd = acc.present varPtr(%d : memref<10xf32>) varType(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>) varType(tensor<10xf32>) -> memref<10xf32> acc.parallel num_gangs({%numGangs: i64}) num_workers(%numWorkers: i64 [#acc.device_type]) 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>) varType(tensor<10xf32>) -> memref<10xf32> // CHECK-NEXT: acc.parallel num_gangs({[[NUMGANG]] : i64}) num_workers([[NUMWORKERS]] : i64 [#acc.device_type]) 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} - %b = acc.cache varPtr(%a : memref<10xf32>) -> memref<10xf32> + %b = acc.cache varPtr(%a : memref<10xf32>) varType(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>) varType(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>) varType(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>) varType(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) varType(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) varType(f64) - %1 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr + %1 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(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) varType(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) varType(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) varType(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) varType(f64) - %5 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr + %5 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(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) varType(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) varType(f64) - %7 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr + %7 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(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) varType(f64) - %8 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr + %8 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(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) varType(f64) - %9 = acc.getdeviceptr varPtr(%a : !llvm.ptr) -> !llvm.ptr + %9 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(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) varType(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) varType(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) varType(f64) -// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(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) varType(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) varType(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) varType(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) varType(f64) -// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(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) varType(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) varType(f64) -// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(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) varType(f64) -// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(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) varType(f64) -// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) -> !llvm.ptr +// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(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) varType(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) varType(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} - %3 = acc.create varPtr(%c : !llvm.ptr) -> !llvm.ptr {dataClause = #acc} + %1 = acc.create varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr + %2 = acc.create varPtr(%b : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc} + %3 = acc.create varPtr(%c : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc} 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) varType(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) varType(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) varType(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) varType(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) varType(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) varType(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) varType(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) varType(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} -// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr) -> !llvm.ptr {dataClause = #acc} +// CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr +// CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[ARGB]] : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc} +// CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[ARGC]] : !llvm.ptr) varType(f64) -> !llvm.ptr {dataClause = #acc} // 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) varType(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) varType(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) varType(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) varType(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) varType(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) varType(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) varType(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>, %c: memref<10x20xf32>) -> () { - %deviceptr = acc.deviceptr varPtr(%a : memref<10xf32>) -> memref<10xf32> {name = "arrayA"} + %deviceptr = acc.deviceptr varPtr(%a : memref<10xf32>) varType(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>) varType(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>) varType(tensor<10xf32>) -> memref<10xf32> acc.parallel dataOperands(%copyin : memref<10xf32>) { } - %copyinreadonly = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} + %copyinreadonly = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} acc.kernels dataOperands(%copyinreadonly : memref<10xf32>) { } - %copyinfromcopy = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} + %copyinfromcopy = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} acc.serial dataOperands(%copyinfromcopy : memref<10xf32>) { } - acc.copyout accPtr(%copyinfromcopy : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc} + acc.copyout accPtr(%copyinfromcopy : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} - %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>) varType(tensor<10xf32>) -> memref<10xf32> + %createimplicit = acc.create varPtr(%c : memref<10x20xf32>) varType(tensor<10x20xf32>) -> memref<10x20xf32> {implicit = true} acc.parallel dataOperands(%create, %createimplicit : memref<10xf32>, memref<10x20xf32>) { } acc.delete accPtr(%create : memref<10xf32>) {dataClause = #acc} acc.delete accPtr(%createimplicit : memref<10x20xf32>) {dataClause = #acc, implicit = true} - %copyoutzero = acc.create varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} + %copyoutzero = acc.create varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} acc.parallel dataOperands(%copyoutzero: memref<10xf32>) { } - acc.copyout accPtr(%copyoutzero : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc} + acc.copyout accPtr(%copyoutzero : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} %attach = acc.attach varPtr(%b : memref>) -> memref> acc.parallel dataOperands(%attach : memref>) { } acc.detach accPtr(%attach : memref>) {dataClause = #acc} - %copyinparent = acc.copyin varPtr(%a : memref<10xf32>) varPtrPtr(%b : memref>) -> memref<10xf32> {dataClause = #acc} + %copyinparent = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) varPtrPtr(%b : memref>) -> memref<10xf32> {dataClause = #acc} acc.parallel dataOperands(%copyinparent : memref<10xf32>) { } - acc.copyout accPtr(%copyinparent : memref<10xf32>) to varPtr(%a : memref<10xf32>) {dataClause = #acc} + acc.copyout accPtr(%copyinparent : memref<10xf32>) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} %c0 = arith.constant 0 : index %c1 = arith.constant 1 : index @@ -1271,93 +1271,93 @@ func.func @teststructureddataclauseops(%a: memref<10xf32>, %b: memref) bounds(%bounds1full) -> memref<10xf32> {name = "arrayA[0:9]"} + %copyinfullslice1 = acc.copyin varPtr(%a : memref<10xf32>) varType(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>) varType(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} + %copyinpartial = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) bounds(%bounds1partial) -> memref<10xf32> {dataClause = #acc} acc.parallel dataOperands(%copyinpartial : memref<10xf32>) { } - acc.copyout accPtr(%copyinpartial : memref<10xf32>) bounds(%bounds1partial) to varPtr(%a : memref<10xf32>) {dataClause = #acc} + acc.copyout accPtr(%copyinpartial : memref<10xf32>) bounds(%bounds1partial) to varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} return } // CHECK: func.func @teststructureddataclauseops([[ARGA:%.*]]: memref<10xf32>, [[ARGB:%.*]]: memref>, [[ARGC:%.*]]: memref<10x20xf32>) { -// CHECK: [[DEVICEPTR:%.*]] = acc.deviceptr varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {name = "arrayA"} +// CHECK: [[DEVICEPTR:%.*]] = acc.deviceptr varPtr([[ARGA]] : memref<10xf32>) varType(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>) varType(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>) varType(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} +// CHECK: [[COPYINRO:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} // CHECK-NEXT: acc.kernels dataOperands([[COPYINRO]] : memref<10xf32>) { // CHECK-NEXT: } -// CHECK: [[COPYINCOPY:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} +// CHECK: [[COPYINCOPY:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} // 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} -// 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>) varType(tensor<10xf32>) {dataClause = #acc} +// CHECK: [[CREATE:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> +// CHECK-NEXT: [[CREATEIMP:%.*]] = acc.create varPtr([[ARGC]] : memref<10x20xf32>) varType(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} // CHECK-NEXT: acc.delete accPtr([[CREATEIMP]] : memref<10x20xf32>) {dataClause = #acc, implicit = true} -// CHECK: [[COPYOUTZ:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} +// CHECK: [[COPYOUTZ:%.*]] = acc.create varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} // 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} +// CHECK-NEXT: acc.copyout accPtr([[COPYOUTZ]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} // CHECK: [[ATTACH:%.*]] = acc.attach varPtr([[ARGB]] : memref>) -> memref> // CHECK-NEXT: acc.parallel dataOperands([[ATTACH]] : memref>) { // CHECK-NEXT: } // CHECK-NEXT: acc.detach accPtr([[ATTACH]] : memref>) {dataClause = #acc} -// CHECK: [[COPYINP:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varPtrPtr([[ARGB]] : memref>) -> memref<10xf32> {dataClause = #acc} +// CHECK: [[COPYINP:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) varPtrPtr([[ARGB]] : memref>) -> memref<10xf32> {dataClause = #acc} // 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} +// CHECK-NEXT: acc.copyout accPtr([[COPYINP]] : memref<10xf32>) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} // 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>) varType(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>) varType(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} +// CHECK-NEXT: [[COPYINPART:%.*]] = acc.copyin varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) bounds([[BOUNDS1P]]) -> memref<10xf32> {dataClause = #acc} // 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} +// CHECK-NEXT: acc.copyout accPtr([[COPYINPART]] : memref<10xf32>) bounds([[BOUNDS1P]]) to varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) {dataClause = #acc} // ----- func.func @testunstructuredclauseops(%a: memref<10xf32>) -> () { - %copyin = acc.copyin varPtr(%a : memref<10xf32>) -> memref<10xf32> {structured = false} + %copyin = acc.copyin varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {structured = false} acc.enter_data dataOperands(%copyin : memref<10xf32>) - %devptr = acc.getdeviceptr varPtr(%a : memref<10xf32>) -> memref<10xf32> {dataClause = #acc} + %devptr = acc.getdeviceptr varPtr(%a : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} 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>) varType(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>) varType(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} +// CHECK: [[DEVPTR:%.*]] = acc.getdeviceptr varPtr([[ARGA]] : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> {dataClause = #acc} // 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>) varType(tensor<10xf32>) {structured = false} // ----- @@ -1382,7 +1382,7 @@ func.func @host_device_ops(%a: memref) -> () { // ----- 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) varType(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) varType(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 } : !llvm.ptr - %1 = acc.create varPtr(%0 : !llvm.ptr) -> !llvm.ptr + %1 = acc.create varPtr(%0 : !llvm.ptr) varType(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 } : !llvm.ptr - %1 = acc.getdeviceptr varPtr(%0 : !llvm.ptr) -> !llvm.ptr {dataClause = #acc} + %1 = acc.getdeviceptr varPtr(%0 : !llvm.ptr) varType(i32) -> !llvm.ptr {dataClause = #acc} 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} : !llvm.ptr -// CHECK-NEXT: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !llvm.ptr) -> !llvm.ptr +// CHECK-NEXT: %[[CREATE:.*]] = acc.create varPtr(%[[ADDR]] : !llvm.ptr) varType(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} : !llvm.ptr -// CHECK-NEXT: %[[DELETE:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !llvm.ptr) -> !llvm.ptr {dataClause = #acc} +// CHECK-NEXT: %[[DELETE:.*]] = acc.getdeviceptr varPtr(%[[ADDR]] : !llvm.ptr) varType(i32) -> !llvm.ptr {dataClause = #acc} // 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 } : (i32) -> !llvm.ptr - %createlocal = acc.create varPtr(%alloc : !llvm.ptr) -> !llvm.ptr {implicit = true} + %createlocal = acc.create varPtr(%alloc : !llvm.ptr) varType(!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>) varType(tensor<10x10xf32>) -> memref<10x10xf32> + %pb = acc.present varPtr(%b : memref<10x10xf32>) varType(tensor<10x10xf32>) -> memref<10x10xf32> + %pc = acc.present varPtr(%c : memref<10xf32>) varType(tensor<10xf32>) -> memref<10xf32> + %pd = acc.present varPtr(%d : memref<10xf32>) varType(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 897311c6e81be..f8fa02c6f3ba0 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) varType(f32) -> !llvm.ptr + %1 = acc.copyin varPtr(%arg1 : !llvm.ptr) varType(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) varType(f32) -> !llvm.ptr + %1 = acc.getdeviceptr varPtr(%arg1 : !llvm.ptr) varType(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) varType(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) varType(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) varType(f32) -> !llvm.ptr + %1 = acc.create varPtr(%arg1 : !llvm.ptr) varType(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) varType(f32) + acc.copyout accPtr(%1 : !llvm.ptr) to varPtr(%arg1 : !llvm.ptr) varType(f32) llvm.return }