1 !RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s
3 !===============================================================================
5 !===============================================================================
7 !CHECK-LABEL: func.func @_QPomp_target_enter_simple() {
8 subroutine omp_target_enter_simple
10 !CHECK: omp.target_enter_data map((to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
11 !$omp target enter data map(to: a)
12 end subroutine omp_target_enter_simple
14 !===============================================================================
15 ! Target_Enter Map types
16 !===============================================================================
18 !CHECK-LABEL: func.func @_QPomp_target_enter_mt() {
19 subroutine omp_target_enter_mt
24 !CHECK: omp.target_enter_data map((to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (always, alloc -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
25 !$omp target enter data map(to: a, b) map(always, alloc: c) map(to: d)
26 end subroutine omp_target_enter_mt
28 !===============================================================================
30 !===============================================================================
32 !CHECK-LABEL: func.func @_QPomp_target_enter_nowait() {
33 subroutine omp_target_enter_nowait
35 !CHECK: omp.target_enter_data nowait map((to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
36 !$omp target enter data map(to: a) nowait
37 end subroutine omp_target_enter_nowait
39 !===============================================================================
41 !===============================================================================
43 !CHECK-LABEL: func.func @_QPomp_target_enter_if() {
44 subroutine omp_target_enter_if
48 !CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1:.*]] : !fir.ref<i32>
49 !CHECK: %[[VAL_4:.*]] = arith.constant 10 : i32
50 !CHECK: %[[VAL_5:.*]] = arith.cmpi slt, %[[VAL_3]], %[[VAL_4]] : i32
51 !CHECK: omp.target_enter_data if(%[[VAL_5]] : i1) map((to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
52 !$omp target enter data if(i<10) map(to: a)
53 end subroutine omp_target_enter_if
55 !===============================================================================
57 !===============================================================================
59 !CHECK-LABEL: func.func @_QPomp_target_enter_device() {
60 subroutine omp_target_enter_device
62 !CHECK: %[[VAL_1:.*]] = arith.constant 2 : i32
63 !CHECK: omp.target_enter_data device(%[[VAL_1]] : i32) map((to -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
64 !$omp target enter data map(to: a) device(2)
65 end subroutine omp_target_enter_device
67 !===============================================================================
69 !===============================================================================
71 !CHECK-LABEL: func.func @_QPomp_target_exit_simple() {
72 subroutine omp_target_exit_simple
74 !CHECK: omp.target_exit_data map((from -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
75 !$omp target exit data map(from: a)
76 end subroutine omp_target_exit_simple
78 !===============================================================================
79 ! Target_Exit Map types
80 !===============================================================================
82 !CHECK-LABEL: func.func @_QPomp_target_exit_mt() {
83 subroutine omp_target_exit_mt
89 !CHECK: omp.target_exit_data map((from -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (from -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (release -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (always, delete -> {{.*}} : !fir.ref<!fir.array<1024xi32>>), (from -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
90 !$omp target exit data map(from: a,b) map(release: c) map(always, delete: d) map(from: e)
91 end subroutine omp_target_exit_mt
93 !===============================================================================
95 !===============================================================================
97 !CHECK-LABEL: func.func @_QPomp_target_exit_device() {
98 subroutine omp_target_exit_device
101 !CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1:.*]] : !fir.ref<i32>
102 !CHECK: omp.target_exit_data device(%[[VAL_2]] : i32) map((from -> {{.*}} : !fir.ref<!fir.array<1024xi32>>))
103 !$omp target exit data map(from: a) device(d)
104 end subroutine omp_target_exit_device
106 !===============================================================================
107 ! Target_Data with region
108 !===============================================================================
110 !CHECK-LABEL: func.func @_QPomp_target_data() {
111 subroutine omp_target_data
112 !CHECK: %[[VAL_0:.*]] = fir.alloca !fir.array<1024xi32> {bindc_name = "a", uniq_name = "_QFomp_target_dataEa"}
114 !CHECK: omp.target_data map((tofrom -> %[[VAL_0]] : !fir.ref<!fir.array<1024xi32>>)) {
115 !$omp target data map(tofrom: a)
116 !CHECK: %[[VAL_1:.*]] = arith.constant 10 : i32
117 !CHECK: %[[VAL_2:.*]] = arith.constant 1 : i64
118 !CHECK: %[[VAL_3:.*]] = arith.constant 1 : i64
119 !CHECK: %[[VAL_4:.*]] = arith.subi %[[VAL_2]], %[[VAL_3]] : i64
120 !CHECK: %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_4]] : (!fir.ref<!fir.array<1024xi32>>, i64) -> !fir.ref<i32>
121 !CHECK: fir.store %[[VAL_1]] to %[[VAL_5]] : !fir.ref<i32>
123 !CHECK: omp.terminator
124 !$omp end target data
126 end subroutine omp_target_data