[flang-commits] [flang] f9dbfb1 - [flang][acc] Update assembly formats to include asyncOnly, async, and wait (#140122)
via flang-commits
flang-commits at lists.llvm.org
Thu May 15 12:56:20 PDT 2025
Author: khaki3
Date: 2025-05-15T12:56:15-07:00
New Revision: f9dbfb1566043d744d66ff8b5415269c6ec59743
URL: https://github.com/llvm/llvm-project/commit/f9dbfb1566043d744d66ff8b5415269c6ec59743
DIFF: https://github.com/llvm/llvm-project/commit/f9dbfb1566043d744d66ff8b5415269c6ec59743.diff
LOG: [flang][acc] Update assembly formats to include asyncOnly, async, and wait (#140122)
The async implementation is inconsistent in terms of the assembly
format. While renaming `UpdateOp`'s `async` to `asyncOnly`, this PR
handles `asyncOnly` along with async operands in every operation.
Regarding `EnterDataOp` and `ExitDataOp`, they do not accept device
types; thus, the async and the wait clauses without values lead to the
`async` and the `wait` attributes (not `asyncOnly` nor `waitOnly`). This
PR also processes them with async and wait operands all together.
Added:
Modified:
flang/test/Lower/OpenACC/acc-data-unwrap-defaultbounds.f90
flang/test/Lower/OpenACC/acc-data.f90
flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90
flang/test/Lower/OpenACC/acc-enter-data.f90
flang/test/Lower/OpenACC/acc-exit-data-unwrap-defaultbounds.f90
flang/test/Lower/OpenACC/acc-exit-data.f90
flang/test/Lower/OpenACC/acc-kernels-loop.f90
flang/test/Lower/OpenACC/acc-kernels.f90
flang/test/Lower/OpenACC/acc-parallel-loop.f90
flang/test/Lower/OpenACC/acc-parallel.f90
flang/test/Lower/OpenACC/acc-serial-loop.f90
flang/test/Lower/OpenACC/acc-serial.f90
flang/test/Lower/OpenACC/acc-update.f90
flang/test/Lower/OpenACC/acc-wait.f90
mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
mlir/test/Dialect/OpenACC/invalid.mlir
mlir/test/Dialect/OpenACC/ops.mlir
Removed:
################################################################################
diff --git a/flang/test/Lower/OpenACC/acc-data-unwrap-defaultbounds.f90 b/flang/test/Lower/OpenACC/acc-data-unwrap-defaultbounds.f90
index d010d39cef4eb..789db34adefee 100644
--- a/flang/test/Lower/OpenACC/acc-data-unwrap-defaultbounds.f90
+++ b/flang/test/Lower/OpenACC/acc-data-unwrap-defaultbounds.f90
@@ -155,8 +155,8 @@ subroutine acc_data
!$acc data present(a) async
!$acc end data
-! CHECK: acc.data dataOperands(%{{.*}}) {
-! CHECK: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK: acc.data async dataOperands(%{{.*}}) {
+! CHECK: }
!$acc data copy(a) async(1)
!$acc end data
diff --git a/flang/test/Lower/OpenACC/acc-data.f90 b/flang/test/Lower/OpenACC/acc-data.f90
index 7965fdc0ac707..3032ce7109c1e 100644
--- a/flang/test/Lower/OpenACC/acc-data.f90
+++ b/flang/test/Lower/OpenACC/acc-data.f90
@@ -155,8 +155,8 @@ subroutine acc_data
!$acc data present(a) async
!$acc end data
-! CHECK: acc.data dataOperands(%{{.*}}) {
-! CHECK: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK: acc.data async dataOperands(%{{.*}}) {
+! CHECK: }
!$acc data copy(a) async(1)
!$acc end data
diff --git a/flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90 b/flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90
index c42350a07c498..3e08068bdec44 100644
--- a/flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90
+++ b/flang/test/Lower/OpenACC/acc-enter-data-unwrap-defaultbounds.f90
@@ -94,20 +94,20 @@ subroutine acc_enter_data
!$acc enter data create(a) async
!CHECK: %[[BOUND0:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
!CHECK: %[[BOUND1:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[EXTENT_C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
-!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%[[BOUND0]], %[[BOUND1]]) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async}
+!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%[[BOUND0]], %[[BOUND1]]) async -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
+!CHECK: acc.enter_data async dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) wait
!CHECK: %[[BOUND0:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
!CHECK: %[[BOUND1:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[EXTENT_C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%[[BOUND0]], %[[BOUND1]]) -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {wait}
+!CHECK: acc.enter_data wait dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) async wait
!CHECK: %[[BOUND0:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
!CHECK: %[[BOUND1:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) extent(%[[EXTENT_C10]] : index) stride(%c1{{.*}} : index) startIdx(%{{.*}} : index)
-!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%[[BOUND0]], %[[BOUND1]]) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async, wait}
+!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%[[BOUND0]], %[[BOUND1]]) async -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
+!CHECK: acc.enter_data async wait dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) async(1)
!CHECK: %[[ASYNC1:.*]] = arith.constant 1 : i32
diff --git a/flang/test/Lower/OpenACC/acc-enter-data.f90 b/flang/test/Lower/OpenACC/acc-enter-data.f90
index 3e49259c360eb..f7396660a6d3c 100644
--- a/flang/test/Lower/OpenACC/acc-enter-data.f90
+++ b/flang/test/Lower/OpenACC/acc-enter-data.f90
@@ -53,16 +53,16 @@ subroutine acc_enter_data
!CHECK: acc.enter_data dataOperands(%[[COPYIN_A]], %[[CREATE_B]], %[[ATTACH_D]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.box<!fir.ptr<f32>>>){{$}}
!$acc enter data create(a) async
-!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async}
+!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
+!CHECK: acc.enter_data async dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) wait
!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {wait}
+!CHECK: acc.enter_data wait dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) async wait
-!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
-!CHECK: acc.enter_data dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async, wait}
+!CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {name = "a", structured = false}
+!CHECK: acc.enter_data async wait dataOperands(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>)
!$acc enter data create(a) async(1)
!CHECK: %[[ASYNC1:.*]] = arith.constant 1 : i32
diff --git a/flang/test/Lower/OpenACC/acc-exit-data-unwrap-defaultbounds.f90 b/flang/test/Lower/OpenACC/acc-exit-data-unwrap-defaultbounds.f90
index 7999a7647f49b..fd942173b637a 100644
--- a/flang/test/Lower/OpenACC/acc-exit-data-unwrap-defaultbounds.f90
+++ b/flang/test/Lower/OpenACC/acc-exit-data-unwrap-defaultbounds.f90
@@ -56,19 +56,19 @@ subroutine acc_exit_data
!CHECK: acc.detach accPtr(%[[DEVPTR_D]] : !fir.ptr<f32>) {name = "d", structured = false}
!$acc exit data delete(a) async
-!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async}
-!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
+!CHECK: acc.exit_data async dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
+!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) async {name = "a", structured = false}
!$acc exit data delete(a) wait
!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {wait}
+!CHECK: acc.exit_data wait dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {name = "a", structured = false}
!$acc exit data delete(a) async wait
-!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async, wait}
-!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
+!CHECK: acc.exit_data async wait dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
+!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) async {name = "a", structured = false}
!$acc exit data delete(a) async(1)
!CHECK: %[[ASYNC1:.*]] = arith.constant 1 : i32
diff --git a/flang/test/Lower/OpenACC/acc-exit-data.f90 b/flang/test/Lower/OpenACC/acc-exit-data.f90
index bf5f7094913a1..cbc63ac81945c 100644
--- a/flang/test/Lower/OpenACC/acc-exit-data.f90
+++ b/flang/test/Lower/OpenACC/acc-exit-data.f90
@@ -54,19 +54,19 @@ subroutine acc_exit_data
!CHECK: acc.detach accPtr(%[[DEVPTR_D]] : !fir.ref<!fir.box<!fir.ptr<f32>>>) {name = "d", structured = false}
!$acc exit data delete(a) async
-!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async}
-!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
+!CHECK: acc.exit_data async dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
+!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) async {name = "a", structured = false}
!$acc exit data delete(a) wait
!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {wait}
+!CHECK: acc.exit_data wait dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
!$acc exit data delete(a) async wait
-!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
-!CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) attributes {async, wait}
-!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+!CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_delete>, name = "a", structured = false}
+!CHECK: acc.exit_data async wait dataOperands(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>)
+!CHECK: acc.delete accPtr(%[[DEVPTR]] : !fir.ref<!fir.array<10x10xf32>>) async {name = "a", structured = false}
!$acc exit data delete(a) async(1)
!CHECK: %[[ASYNC1:.*]] = arith.constant 1 : i32
diff --git a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
index a330b7d491d06..8608b0ad98ce6 100644
--- a/flang/test/Lower/OpenACC/acc-kernels-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
@@ -69,12 +69,12 @@ subroutine acc_kernels_loop
END DO
!$acc end kernels loop
-! CHECK: acc.kernels {{.*}} {
+! CHECK: acc.kernels {{.*}} async {
! CHECK: acc.loop {{.*}} {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
! CHECK: acc.terminator
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc kernels loop async(1)
DO i = 1, n
diff --git a/flang/test/Lower/OpenACC/acc-kernels.f90 b/flang/test/Lower/OpenACC/acc-kernels.f90
index 6b7a625b34f71..b90870db25095 100644
--- a/flang/test/Lower/OpenACC/acc-kernels.f90
+++ b/flang/test/Lower/OpenACC/acc-kernels.f90
@@ -38,9 +38,9 @@ subroutine acc_kernels
!$acc kernels async
!$acc end kernels
-! CHECK: acc.kernels {
+! CHECK: acc.kernels async {
! CHECK: acc.terminator
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc kernels async(1)
!$acc end kernels
diff --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index 1e1fc7448a513..4cf268d2517f5 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -71,12 +71,12 @@ subroutine acc_parallel_loop
END DO
!$acc end parallel loop
-! CHECK: acc.parallel {{.*}} {
+! CHECK: acc.parallel {{.*}} async {
! CHECK: acc.loop {{.*}} {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
! CHECK: acc.yield
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc parallel loop async(1)
DO i = 1, n
diff --git a/flang/test/Lower/OpenACC/acc-parallel.f90 b/flang/test/Lower/OpenACC/acc-parallel.f90
index e00ea41210966..1eae106ba61b2 100644
--- a/flang/test/Lower/OpenACC/acc-parallel.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel.f90
@@ -60,9 +60,9 @@ subroutine acc_parallel
!$acc parallel async
!$acc end parallel
-! CHECK: acc.parallel {
+! CHECK: acc.parallel async {
! CHECK: acc.yield
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc parallel async(1)
!$acc end parallel
diff --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90
index 98fc28990265a..34391f78ae707 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -90,12 +90,12 @@ subroutine acc_serial_loop
END DO
!$acc end serial loop
-! CHECK: acc.serial {{.*}} {
+! CHECK: acc.serial {{.*}} async {
! CHECK: acc.loop {{.*}} {
! CHECK: acc.yield
! CHECK-NEXT: }{{$}}
! CHECK: acc.yield
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc serial loop async(1)
DO i = 1, n
diff --git a/flang/test/Lower/OpenACC/acc-serial.f90 b/flang/test/Lower/OpenACC/acc-serial.f90
index 9ba44ce6b9197..1e4f32fd209ef 100644
--- a/flang/test/Lower/OpenACC/acc-serial.f90
+++ b/flang/test/Lower/OpenACC/acc-serial.f90
@@ -60,9 +60,9 @@ subroutine acc_serial
!$acc serial async
!$acc end serial
-! CHECK: acc.serial {
+! CHECK: acc.serial async {
! CHECK: acc.yield
-! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]}
+! CHECK-NEXT: }
!$acc serial async(1)
!$acc end serial
diff --git a/flang/test/Lower/OpenACC/acc-update.f90 b/flang/test/Lower/OpenACC/acc-update.f90
index f96b105ed93bd..f98af425de985 100644
--- a/flang/test/Lower/OpenACC/acc-update.f90
+++ b/flang/test/Lower/OpenACC/acc-update.f90
@@ -63,9 +63,9 @@ subroutine acc_update
! CHECK: acc.update_host accPtr(%[[DEVPTR_B]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "b", structured = false}
!$acc update host(a) async
-! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
+! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
! CHECK: acc.update async dataOperands(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>)
-! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) async to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
!$acc update host(a) wait
! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
@@ -73,9 +73,9 @@ subroutine acc_update
! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
!$acc update host(a) async wait
-! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<none>], dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
+! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
! CHECK: acc.update async wait dataOperands(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>)
-! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {asyncOnly = [#acc.device_type<none>], name = "a", structured = false}
+! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) async to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
!$acc update host(a) async(1)
! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32
@@ -108,8 +108,8 @@ subroutine acc_update
! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
!$acc update host(a) device_type(host, nvidia) async
-! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {asyncOnly = [#acc.device_type<host>, #acc.device_type<nvidia>], dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
+! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async([#acc.device_type<host>, #acc.device_type<nvidia>]) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_update_host>, name = "a", structured = false}
! CHECK: acc.update async([#acc.device_type<host>, #acc.device_type<nvidia>]) dataOperands(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>)
-! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {asyncOnly = [#acc.device_type<host>, #acc.device_type<nvidia>], name = "a", structured = false}
+! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref<!fir.array<10x10xf32>>) async([#acc.device_type<host>, #acc.device_type<nvidia>]) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a", structured = false}
end subroutine acc_update
diff --git a/flang/test/Lower/OpenACC/acc-wait.f90 b/flang/test/Lower/OpenACC/acc-wait.f90
index 8a42c97a12811..35db640a054c2 100644
--- a/flang/test/Lower/OpenACC/acc-wait.f90
+++ b/flang/test/Lower/OpenACC/acc-wait.f90
@@ -25,7 +25,7 @@ subroutine acc_update
!$acc wait(1) async
!CHECK: [[WAIT3:%.*]] = arith.constant 1 : i32
-!CHECK: acc.wait([[WAIT3]] : i32) attributes {async}
+!CHECK: acc.wait([[WAIT3]] : i32) async
!$acc wait(1) async(async)
!CHECK: [[WAIT3:%.*]] = arith.constant 1 : i32
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 5d5add6318e06..3c22aeb9a1ff7 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -561,8 +561,8 @@ class OpenACC_DataEntryOp<string mnemonic, string clause, string extraDescriptio
oilist(
`varPtrPtr` `(` $varPtrPtr `:` type($varPtrPtr) `)`
| `bounds` `(` $bounds `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
) `->` type($accVar) attr-dict
}];
@@ -922,8 +922,8 @@ class OpenACC_DataExitOpWithVarPtr<string mnemonic, string clause>
let assemblyFormat = [{
custom<AccVar>($accVar, type($accVar))
(`bounds` `(` $bounds^ `)` )?
- (`async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType)^ `)`)?
+ (`async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)^)?
`to` custom<Var>($var) `:` custom<VarPtrType>(type($var), $varType)
attr-dict
}];
@@ -983,8 +983,8 @@ class OpenACC_DataExitOpNoVarPtr<string mnemonic, string clause> :
let assemblyFormat = [{
custom<AccVar>($accVar, type($accVar))
(`bounds` `(` $bounds^ `)` )?
- (`async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType)^ `)`)?
+ (`async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)^)?
attr-dict
}];
@@ -1439,8 +1439,8 @@ def OpenACC_ParallelOp : OpenACC_Op<"parallel",
( `combined` `(` `loop` `)` $combined^)?
oilist(
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
| `firstprivate` `(` custom<SymOperandList>($firstprivateOperands,
type($firstprivateOperands), $firstprivatizations)
`)`
@@ -1581,8 +1581,8 @@ def OpenACC_SerialOp : OpenACC_Op<"serial",
( `combined` `(` `loop` `)` $combined^)?
oilist(
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
| `firstprivate` `(` custom<SymOperandList>($firstprivateOperands,
type($firstprivateOperands), $firstprivatizations)
`)`
@@ -1750,8 +1750,8 @@ def OpenACC_KernelsOp : OpenACC_Op<"kernels",
( `combined` `(` `loop` `)` $combined^)?
oilist(
`dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
| `num_gangs` `(` custom<NumGangs>($numGangs,
type($numGangs), $numGangsDeviceType, $numGangsSegments) `)`
| `num_workers` `(` custom<DeviceTypeOperands>($numWorkers,
@@ -1870,8 +1870,8 @@ def OpenACC_DataOp : OpenACC_Op<"data",
let assemblyFormat = [{
oilist(
`if` `(` $ifCond `)`
- | `async` `(` custom<DeviceTypeOperands>($asyncOperands,
- type($asyncOperands), $asyncOperandsDeviceType) `)`
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
| `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
| `wait` `` custom<WaitClause>($waitOperands, type($waitOperands),
$waitOperandsDeviceType, $waitOperandsSegments, $hasWaitDevnum,
@@ -1934,9 +1934,11 @@ def OpenACC_EnterDataOp : OpenACC_Op<"enter_data",
let assemblyFormat = [{
oilist(
`if` `(` $ifCond `)`
- | `async` `(` $asyncOperand `:` type($asyncOperand) `)`
+ | `async` `` custom<OperandWithKeywordOnly>($asyncOperand,
+ type($asyncOperand), $async)
| `wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)`
- | `wait` `(` $waitOperands `:` type($waitOperands) `)`
+ | `wait` `` custom<OperandsWithKeywordOnly>($waitOperands,
+ type($waitOperands), $wait)
| `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
)
attr-dict-with-keyword
@@ -1986,9 +1988,11 @@ def OpenACC_ExitDataOp : OpenACC_Op<"exit_data",
let assemblyFormat = [{
oilist(
`if` `(` $ifCond `)`
- | `async` `(` $asyncOperand `:` type($asyncOperand) `)`
+ | `async` `` custom<OperandWithKeywordOnly>($asyncOperand,
+ type($asyncOperand), $async)
| `wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)`
- | `wait` `(` $waitOperands `:` type($waitOperands) `)`
+ | `wait` `` custom<OperandsWithKeywordOnly>($waitOperands,
+ type($waitOperands), $wait)
| `dataOperands` `(` $dataClauseOperands `:` type($dataClauseOperands) `)`
)
attr-dict-with-keyword
@@ -2853,7 +2857,7 @@ def OpenACC_UpdateOp : OpenACC_Op<"update",
let arguments = (ins Optional<I1>:$ifCond,
Variadic<IntOrIndex>:$asyncOperands,
OptionalAttr<DeviceTypeArrayAttr>:$asyncOperandsDeviceType,
- OptionalAttr<DeviceTypeArrayAttr>:$async,
+ OptionalAttr<DeviceTypeArrayAttr>:$asyncOnly,
Variadic<IntOrIndex>:$waitOperands,
OptionalAttr<DenseI32ArrayAttr>:$waitOperandsSegments,
OptionalAttr<DeviceTypeArrayAttr>:$waitOperandsDeviceType,
@@ -2901,9 +2905,8 @@ def OpenACC_UpdateOp : OpenACC_Op<"update",
let assemblyFormat = [{
oilist(
`if` `(` $ifCond `)`
- | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>(
- $asyncOperands, type($asyncOperands),
- $asyncOperandsDeviceType, $async)
+ | `async` `` custom<DeviceTypeOperandsWithKeywordOnly>($asyncOperands,
+ type($asyncOperands), $asyncOperandsDeviceType, $asyncOnly)
| `wait` `` custom<WaitClause>($waitOperands, type($waitOperands),
$waitOperandsDeviceType, $waitOperandsSegments, $hasWaitDevnum,
$waitOnly)
@@ -2948,9 +2951,11 @@ def OpenACC_WaitOp : OpenACC_Op<"wait", [AttrSizedOperandSegments]> {
let assemblyFormat = [{
( `(` $waitOperands^ `:` type($waitOperands) `)` )?
- oilist(`async` `(` $asyncOperand `:` type($asyncOperand) `)`
- |`wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)`
- |`if` `(` $ifCond `)`
+ oilist(
+ `async` `` custom<OperandWithKeywordOnly>($asyncOperand,
+ type($asyncOperand), $async)
+ | `wait_devnum` `(` $waitDevnum `:` type($waitDevnum) `)`
+ | `if` `(` $ifCond `)`
) attr-dict-with-keyword
}];
let hasVerifier = 1;
diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index 7eb72d433c972..b401d2ec7894a 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -272,11 +272,12 @@ static LogicalResult checkWaitAndAsyncConflict(Op op) {
++dtypeInt) {
auto dtype = static_cast<acc::DeviceType>(dtypeInt);
- // The async attribute represent the async clause without value. Therefore
- // the attribute and operand cannot appear at the same time.
+ // The asyncOnly attribute represent the async clause without value.
+ // Therefore the attribute and operand cannot appear at the same time.
if (hasDeviceType(op.getAsyncOperandsDeviceType(), dtype) &&
op.hasAsyncOnly(dtype))
- return op.emitError("async attribute cannot appear with asyncOperand");
+ return op.emitError(
+ "asyncOnly attribute cannot appear with asyncOperand");
// The wait attribute represent the wait clause without values. Therefore
// the attribute and operands cannot appear at the same time.
@@ -1683,6 +1684,90 @@ static void printDeviceTypeOperandsWithKeywordOnly(
p << ")";
}
+static ParseResult parseOperandWithKeywordOnly(
+ mlir::OpAsmParser &parser,
+ std::optional<OpAsmParser::UnresolvedOperand> &operand,
+ mlir::Type &operandType, mlir::UnitAttr &attr) {
+ // Keyword only
+ if (failed(parser.parseOptionalLParen())) {
+ attr = mlir::UnitAttr::get(parser.getContext());
+ return success();
+ }
+
+ OpAsmParser::UnresolvedOperand op;
+ if (failed(parser.parseOperand(op)))
+ return failure();
+ operand = op;
+ if (failed(parser.parseColon()))
+ return failure();
+ if (failed(parser.parseType(operandType)))
+ return failure();
+ if (failed(parser.parseRParen()))
+ return failure();
+
+ return success();
+}
+
+static void printOperandWithKeywordOnly(mlir::OpAsmPrinter &p,
+ mlir::Operation *op,
+ std::optional<mlir::Value> operand,
+ mlir::Type operandType,
+ mlir::UnitAttr attr) {
+ if (attr)
+ return;
+
+ p << "(";
+ p.printOperand(*operand);
+ p << " : ";
+ p.printType(operandType);
+ p << ")";
+}
+
+static ParseResult parseOperandsWithKeywordOnly(
+ mlir::OpAsmParser &parser,
+ llvm::SmallVectorImpl<mlir::OpAsmParser::UnresolvedOperand> &operands,
+ llvm::SmallVectorImpl<Type> &types, mlir::UnitAttr &attr) {
+ // Keyword only
+ if (failed(parser.parseOptionalLParen())) {
+ attr = mlir::UnitAttr::get(parser.getContext());
+ return success();
+ }
+
+ if (failed(parser.parseCommaSeparatedList([&]() {
+ if (parser.parseOperand(operands.emplace_back()))
+ return failure();
+ return success();
+ })))
+ return failure();
+ if (failed(parser.parseColon()))
+ return failure();
+ if (failed(parser.parseCommaSeparatedList([&]() {
+ if (parser.parseType(types.emplace_back()))
+ return failure();
+ return success();
+ })))
+ return failure();
+ if (failed(parser.parseRParen()))
+ return failure();
+
+ return success();
+}
+
+static void printOperandsWithKeywordOnly(mlir::OpAsmPrinter &p,
+ mlir::Operation *op,
+ mlir::OperandRange operands,
+ mlir::TypeRange types,
+ mlir::UnitAttr attr) {
+ if (attr)
+ return;
+
+ p << "(";
+ llvm::interleaveComma(operands, p, [&](auto it) { p << it; });
+ p << " : ";
+ llvm::interleaveComma(types, p, [&](auto it) { p << it; });
+ p << ")";
+}
+
static ParseResult
parseCombinedConstructsLoop(mlir::OpAsmParser &parser,
mlir::acc::CombinedConstructsTypeAttr &attr) {
@@ -3505,7 +3590,7 @@ bool UpdateOp::hasAsyncOnly() {
}
bool UpdateOp::hasAsyncOnly(mlir::acc::DeviceType deviceType) {
- return hasDeviceType(getAsync(), deviceType);
+ return hasDeviceType(getAsyncOnly(), deviceType);
}
mlir::Value UpdateOp::getAsyncValue() {
diff --git a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
index d8e89f64f8bc0..c08fd860e738b 100644
--- a/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
+++ b/mlir/test/Conversion/OpenACCToSCF/convert-openacc-to-scf.mlir
@@ -68,20 +68,20 @@ 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>
- acc.enter_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
+ acc.enter_data async if(%true) dataOperands(%0 : memref<f32>)
return
}
// CHECK-LABEL: func.func @enter_data_true
// CHECK-NOT: if
-// CHECK: acc.enter_data dataOperands
+// CHECK: acc.enter_data async dataOperands
// -----
func.func @enter_data_false(%d1 : memref<f32>) {
%false = arith.constant false
%0 = acc.create varPtr(%d1 : memref<f32>) -> memref<f32>
- acc.enter_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
+ acc.enter_data async if(%false) dataOperands(%0 : memref<f32>)
return
}
@@ -93,21 +93,21 @@ 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>
- acc.exit_data if(%true) dataOperands(%0 : memref<f32>) attributes {async}
+ acc.exit_data async if(%true) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
}
// CHECK-LABEL: func.func @exit_data_true
// CHECK-NOT:if
-// CHECK:acc.exit_data dataOperands
+// CHECK:acc.exit_data async dataOperands
// -----
func.func @exit_data_false(%d1 : memref<f32>) {
%false = arith.constant false
%0 = acc.getdeviceptr varPtr(%d1 : memref<f32>) -> memref<f32>
- acc.exit_data if(%false) dataOperands(%0 : memref<f32>) attributes {async}
+ acc.exit_data async if(%false) dataOperands(%0 : memref<f32>)
acc.delete accPtr(%0 : memref<f32>)
return
}
diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir
index c8d7a87112917..aadf189273212 100644
--- a/mlir/test/Dialect/OpenACC/invalid.mlir
+++ b/mlir/test/Dialect/OpenACC/invalid.mlir
@@ -129,8 +129,8 @@ acc.update
%cst = arith.constant 1 : index
%value = memref.alloc() : 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>]}
+// expected-error at +1 {{asyncOnly attribute cannot appear with asyncOperand}}
+acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {asyncOnly = [#acc.device_type<none>]}
// -----
@@ -138,7 +138,7 @@ acc.update async(%cst: index) dataOperands(%0 : memref<f32>) attributes {async =
%value = memref.alloc() : 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>]}
+acc.update wait({%cst: index}) dataOperands(%0: memref<f32>) attributes {waitOnly = [#acc.device_type<none>]}
// -----
diff --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir
index 4c842a26f8dc4..550f295f074a2 100644
--- a/mlir/test/Dialect/OpenACC/ops.mlir
+++ b/mlir/test/Dialect/OpenACC/ops.mlir
@@ -435,10 +435,10 @@ func.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x
} attributes {defaultAttr = #acc<defaultvalue none>}
acc.parallel {
} attributes {defaultAttr = #acc<defaultvalue present>}
- acc.parallel {
- } attributes {asyncAttr}
- acc.parallel {
- } attributes {waitAttr}
+ acc.parallel async {
+ }
+ acc.parallel wait {
+ }
acc.parallel {
} attributes {selfAttr}
return
@@ -488,10 +488,10 @@ func.func @testparallelop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.parallel {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
-// CHECK: acc.parallel {
-// CHECK-NEXT: } attributes {asyncAttr}
-// CHECK: acc.parallel {
-// CHECK-NEXT: } attributes {waitAttr}
+// CHECK: acc.parallel async {
+// CHECK-NEXT: }
+// CHECK: acc.parallel wait {
+// CHECK-NEXT: }
// CHECK: acc.parallel {
// CHECK-NEXT: } attributes {selfAttr}
@@ -567,10 +567,10 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
} attributes {defaultAttr = #acc<defaultvalue none>}
acc.serial {
} attributes {defaultAttr = #acc<defaultvalue present>}
- acc.serial {
- } attributes {asyncAttr}
- acc.serial {
- } attributes {waitAttr}
+ acc.serial async {
+ }
+ acc.serial wait {
+ }
acc.serial {
} attributes {selfAttr}
acc.serial {
@@ -604,10 +604,10 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.serial {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
-// CHECK: acc.serial {
-// CHECK-NEXT: } attributes {asyncAttr}
-// CHECK: acc.serial {
-// CHECK-NEXT: } attributes {waitAttr}
+// CHECK: acc.serial async {
+// CHECK-NEXT: }
+// CHECK: acc.serial wait {
+// CHECK-NEXT: }
// CHECK: acc.serial {
// CHECK-NEXT: } attributes {selfAttr}
// CHECK: acc.serial {
@@ -639,10 +639,10 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
} attributes {defaultAttr = #acc<defaultvalue none>}
acc.kernels {
} attributes {defaultAttr = #acc<defaultvalue present>}
- acc.kernels {
- } attributes {asyncAttr}
- acc.kernels {
- } attributes {waitAttr}
+ acc.kernels async {
+ }
+ acc.kernels wait {
+ }
acc.kernels {
} attributes {selfAttr}
acc.kernels {
@@ -673,10 +673,10 @@ func.func @testserialop(%a: memref<10xf32>, %b: memref<10xf32>, %c: memref<10x10
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.kernels {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue present>}
-// CHECK: acc.kernels {
-// CHECK-NEXT: } attributes {asyncAttr}
-// CHECK: acc.kernels {
-// CHECK-NEXT: } attributes {waitAttr}
+// CHECK: acc.kernels async {
+// CHECK-NEXT: }
+// CHECK: acc.kernels wait {
+// CHECK-NEXT: }
// CHECK: acc.kernels {
// CHECK-NEXT: } attributes {selfAttr}
// CHECK: acc.kernels {
@@ -787,23 +787,23 @@ func.func @testdataop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
acc.data {
} attributes { defaultAttr = #acc<defaultvalue none> }
- acc.data {
- } attributes { defaultAttr = #acc<defaultvalue none>, async }
+ acc.data async {
+ } attributes { defaultAttr = #acc<defaultvalue none> }
%a1 = arith.constant 1 : i64
acc.data async(%a1 : i64) {
- } attributes { defaultAttr = #acc<defaultvalue none>, async }
+ } attributes { defaultAttr = #acc<defaultvalue none> }
- acc.data {
- } attributes { defaultAttr = #acc<defaultvalue none>, wait }
+ acc.data wait {
+ } attributes { defaultAttr = #acc<defaultvalue none> }
%w1 = arith.constant 1 : i64
acc.data wait({%w1 : i64}) {
- } attributes { defaultAttr = #acc<defaultvalue none>, wait }
+ } attributes { defaultAttr = #acc<defaultvalue none> }
%wd1 = arith.constant 1 : i64
acc.data wait({devnum: %wd1 : i64, %w1 : i64}) {
- } attributes { defaultAttr = #acc<defaultvalue none>, wait }
+ } attributes { defaultAttr = #acc<defaultvalue none> }
return
}
@@ -904,20 +904,20 @@ func.func @testdataop(%a: memref<f32>, %b: memref<f32>, %c: memref<f32>) -> () {
// CHECK: acc.data {
// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
-// CHECK: acc.data {
-// CHECK-NEXT: } attributes {async, defaultAttr = #acc<defaultvalue none>}
+// CHECK: acc.data async {
+// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.data async(%{{.*}} : i64) {
-// CHECK-NEXT: } attributes {async, defaultAttr = #acc<defaultvalue none>}
+// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
-// CHECK: acc.data {
-// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
+// CHECK: acc.data wait {
+// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.data wait({%{{.*}} : i64}) {
-// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
+// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// CHECK: acc.data wait({devnum: %{{.*}} : i64, %{{.*}} : i64}) {
-// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>, wait}
+// CHECK-NEXT: } attributes {defaultAttr = #acc<defaultvalue none>}
// -----
@@ -977,7 +977,7 @@ acc.wait async(%i32Value: i32)
acc.wait async(%idxValue: index)
acc.wait(%i32Value: i32) async(%idxValue: index)
acc.wait(%i64Value: i64) wait_devnum(%i32Value: i32)
-acc.wait attributes {async}
+acc.wait async
acc.wait(%i64Value: i64) async(%idxValue: index) wait_devnum(%i32Value: i32)
acc.wait(%i64Value: i64) wait_devnum(%i32Value: i32) async(%idxValue: index)
acc.wait if(%ifCond)
@@ -996,7 +996,7 @@ acc.wait if(%ifCond)
// CHECK: acc.wait async([[IDXVALUE]] : index)
// CHECK: acc.wait([[I32VALUE]] : i32) async([[IDXVALUE]] : index)
// CHECK: acc.wait([[I64VALUE]] : i64) wait_devnum([[I32VALUE]] : i32)
-// CHECK: acc.wait attributes {async}
+// CHECK: acc.wait async
// CHECK: acc.wait([[I64VALUE]] : i64) async([[IDXVALUE]] : index) wait_devnum([[I32VALUE]] : i32)
// CHECK: acc.wait([[I64VALUE]] : i64) async([[IDXVALUE]] : index) wait_devnum([[I32VALUE]] : i32)
// CHECK: acc.wait if([[IFCOND]])
@@ -1078,7 +1078,7 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
acc.delete accPtr(%1 : !llvm.ptr)
%2 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
- acc.exit_data dataOperands(%2 : !llvm.ptr) attributes {async,finalize}
+ acc.exit_data async dataOperands(%2 : !llvm.ptr) attributes {finalize}
acc.delete accPtr(%2 : !llvm.ptr)
%3 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
@@ -1086,11 +1086,11 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
acc.detach accPtr(%3 : !llvm.ptr)
%4 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
- acc.exit_data dataOperands(%4 : !llvm.ptr) attributes {async}
+ acc.exit_data async dataOperands(%4 : !llvm.ptr)
acc.copyout accPtr(%4 : !llvm.ptr) to varPtr(%a : !llvm.ptr) varType(f64)
%5 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
- acc.exit_data dataOperands(%5 : !llvm.ptr) attributes {wait}
+ acc.exit_data wait dataOperands(%5 : !llvm.ptr)
acc.delete accPtr(%5 : !llvm.ptr)
%6 = acc.getdeviceptr varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
@@ -1127,7 +1127,7 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !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.exit_data async dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {finalize}
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
@@ -1135,11 +1135,11 @@ func.func @testexitdataop(%a: !llvm.ptr) -> () {
// CHECK: acc.detach accPtr(%[[DEVPTR]] : !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.exit_data async dataOperands(%[[DEVPTR]] : !llvm.ptr)
// CHECK: acc.copyout accPtr(%[[DEVPTR]] : !llvm.ptr) to varPtr(%[[ARGA]] : !llvm.ptr) varType(f64)
// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
-// CHECK: acc.exit_data dataOperands(%[[DEVPTR]] : !llvm.ptr) attributes {wait}
+// CHECK: acc.exit_data wait dataOperands(%[[DEVPTR]] : !llvm.ptr)
// CHECK: acc.delete accPtr(%[[DEVPTR]] : !llvm.ptr)
// CHECK: %[[DEVPTR:.*]] = acc.getdeviceptr varPtr(%[[ARGA]] : !llvm.ptr) varType(f64) -> !llvm.ptr
@@ -1176,9 +1176,9 @@ func.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !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) varType(f64) -> !llvm.ptr
- acc.enter_data dataOperands(%5 : !llvm.ptr) attributes {async}
+ acc.enter_data async dataOperands(%5 : !llvm.ptr)
%6 = acc.create varPtr(%a : !llvm.ptr) varType(f64) -> !llvm.ptr
- acc.enter_data dataOperands(%6 : !llvm.ptr) attributes {wait}
+ acc.enter_data wait dataOperands(%6 : !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) varType(f64) -> !llvm.ptr
@@ -1205,9 +1205,9 @@ func.func @testenterdataop(%a: !llvm.ptr, %b: !llvm.ptr, %c: !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) varType(f64) -> !llvm.ptr
-// CHECK: acc.enter_data dataOperands(%[[COPYIN]] : !llvm.ptr) attributes {async}
+// CHECK: acc.enter_data async dataOperands(%[[COPYIN]] : !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: acc.enter_data wait dataOperands(%[[CREATE]] : !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) varType(f64) -> !llvm.ptr
More information about the flang-commits
mailing list