diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td --- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td +++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td @@ -1332,6 +1332,36 @@ let hasVerifier = 0; } +def OpenACC_DeclareOp : OpenACC_Op<"declare", [RecursiveMemoryEffects]> { + let summary = "declare implicit region"; + + let description = [{ + The "acc.declare" operation represents an implicit declare region in + function (and subroutine in Fortran). + + Example: + + ```mlir + %pa = acc.present varPtr(%a : memref<10x10xf32>) -> memref<10x10xf32> + acc.declare dataOperands(%pa: memref<10x10xf32>) { + // implicit region + } + ``` + }]; + + let arguments = (ins + Variadic:$dataClauseOperands); + + let regions = (region AnyRegion:$region); + + let assemblyFormat = [{ + `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)` + $region attr-dict-with-keyword + }]; + + let hasVerifier = 1; +} + //===----------------------------------------------------------------------===// // 2.15.1 Routine Directive //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -1037,6 +1037,14 @@ return checkDeclareOperands(*this, this->getDataClauseOperands()); } +//===----------------------------------------------------------------------===// +// DeclareOp +//===----------------------------------------------------------------------===// + +LogicalResult acc::DeclareOp::verify() { + return checkDeclareOperands(*this, this->getDataClauseOperands()); +} + //===----------------------------------------------------------------------===// // RoutineOp //===----------------------------------------------------------------------===// diff --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir --- a/mlir/test/Dialect/OpenACC/ops.mlir +++ b/mlir/test/Dialect/OpenACC/ops.mlir @@ -1674,3 +1674,24 @@ // CHECK-LABEL: func.func @acc_func // CHECK: "test.openacc_dummy_op"() {acc.declare_action = #acc.declare_action} + +// ----- + +func.func @compute3(%a: memref<10x10xf32>, %b: memref<10x10xf32>, %c: memref<10xf32>, %d: memref<10xf32>) { + %lb = arith.constant 0 : index + %st = arith.constant 1 : index + %c10 = arith.constant 10 : index + %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> + acc.declare dataOperands(%pa, %pb, %pc, %pd: memref<10x10xf32>, memref<10x10xf32>, memref<10xf32>, memref<10xf32>) { + } + return +} + +// CHECK-LABEL: func.func @compute3 +// CHECK: acc.declare dataOperands(