1- ! RUN: %flang_fc1 -I nowhere -emit-fir -flang-deprecated-no- hlfir -fopenacc %s -o - | FileCheck %s
1+ ! RUN: %flang_fc1 -I nowhere -emit-hlfir -fopenacc %s -o - | FileCheck %s
22
33! This test checks the lowering of atomic capture
44
5- program acc_atomic_capture_test
5+ program acc_atomic_capture_test
66 integer :: x, y
77
88! CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
9+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %0 {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
910! CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
10- ! CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
11+ ! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %2 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
12+ ! CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
1113! CHECK: acc.atomic.capture {
12- ! CHECK: acc.atomic.read %[[X]] = %[[Y]] : !fir.ref<i32>
13- ! CHECK: acc.atomic.update %[[Y]] : !fir.ref<i32> {
14+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
15+ ! CHECK: acc.atomic.update %[[Y_DECL]]#1 : !fir.ref<i32> {
1416! CHECK: ^bb0(%[[ARG:.*]]: i32):
1517! CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[ARG]] : i32
1618! CHECK: acc.yield %[[result]] : i32
@@ -23,14 +25,14 @@ program acc_atomic_capture_test
2325 ! $acc end atomic
2426
2527
26- ! CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
28+ ! CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
2729! CHECK: acc.atomic.capture {
28- ! CHECK: acc.atomic.update %[[Y]] : !fir.ref<i32> {
30+ ! CHECK: acc.atomic.update %[[Y_DECL]]#1 : !fir.ref<i32> {
2931! CHECK: ^bb0(%[[ARG:.*]]: i32):
3032! CHECK: %[[result:.*]] = arith.muli %[[temp]], %[[ARG]] : i32
3133! CHECK: acc.yield %[[result]] : i32
3234! CHECK: }
33- ! CHECK: acc.atomic.read %[[X]] = %[[Y]] : !fir.ref<i32>
35+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
3436! CHECK: }
3537
3638 ! $acc atomic capture
@@ -40,13 +42,13 @@ program acc_atomic_capture_test
4042
4143! CHECK: %[[constant_20:.*]] = arith.constant 20 : i32
4244! CHECK: %[[constant_8:.*]] = arith.constant 8 : i32
43- ! CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
45+ ! CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
4446! CHECK: %[[result:.*]] = arith.subi %[[constant_8]], %[[temp]] : i32
45- ! CHECK: %[[result_noreassoc:.*]] = fir .no_reassoc %[[result]] : i32
47+ ! CHECK: %[[result_noreassoc:.*]] = hlfir .no_reassoc %[[result]] : i32
4648! CHECK: %[[result:.*]] = arith.addi %[[constant_20]], %[[result_noreassoc]] : i32
4749! CHECK: acc.atomic.capture {
48- ! CHECK: acc.atomic.read %[[X]] = %[[Y]] : !fir.ref<i32>
49- ! CHECK: acc.atomic.write %[[Y]] = %[[result]] : !fir.ref<i32>, i32
50+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
51+ ! CHECK: acc.atomic.write %[[Y_DECL]]#1 = %[[result]] : !fir.ref<i32>, i32
5052! CHECK: }
5153
5254 ! $acc atomic capture
@@ -59,24 +61,19 @@ program acc_atomic_capture_test
5961
6062subroutine pointers_in_atomic_capture ()
6163! CHECK: %[[A:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "a", uniq_name = "_QFpointers_in_atomic_captureEa"}
62- ! CHECK: {{.*}} = fir.zero_bits !fir.ptr<i32>
63- ! CHECK: {{.*}} = fir.embox {{.*}} : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
64- ! CHECK: fir.store {{.*}} to %[[A]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
64+ ! CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFpointers_in_atomic_captureEa"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
6565! CHECK: %[[B:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "b", uniq_name = "_QFpointers_in_atomic_captureEb"}
66- ! CHECK: {{.*}} = fir.zero_bits !fir.ptr<i32>
67- ! CHECK: {{.*}} = fir.embox {{.*}} : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
68- ! CHECK: fir.store {{.*}} to %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
66+ ! CHECK: %[[B_DECL:.*]]:2 = hlfir.declare %[[B]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFpointers_in_atomic_captureEb"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
6967! CHECK: %[[C:.*]] = fir.alloca i32 {bindc_name = "c", fir.target, uniq_name = "_QFpointers_in_atomic_captureEc"}
68+ ! CHECK: %[[C_DECL:.*]]:2 = hlfir.declare %[[C]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFpointers_in_atomic_captureEc"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
7069! CHECK: %[[D:.*]] = fir.alloca i32 {bindc_name = "d", fir.target, uniq_name = "_QFpointers_in_atomic_captureEd"}
71- ! CHECK: {{.*}} = fir.embox {{.*}} : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
72- ! CHECK: fir.store {{.*}} to %[[A]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
73- ! CHECK: {{.*}} = fir.embox {{.*}} : (!fir.ref<i32>) -> !fir.box<!fir.ptr<i32>>
74- ! CHECK: fir.store {{.*}} to %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
75- ! CHECK: %[[loaded_A:.*]] = fir.load %[[A]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
70+ ! CHECK: %[[D_DECL:.*]]:2 = hlfir.declare %[[D]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFpointers_in_atomic_captureEd"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
71+
72+ ! CHECK: %[[loaded_A:.*]] = fir.load %[[A_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
7673! CHECK: %[[loaded_A_addr:.*]] = fir.box_addr %[[loaded_A]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
77- ! CHECK: %[[loaded_B:.*]] = fir.load %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
74+ ! CHECK: %[[loaded_B:.*]] = fir.load %[[B_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
7875! CHECK: %[[loaded_B_addr:.*]] = fir.box_addr %[[loaded_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
79- ! CHECK: %[[PRIVATE_LOADED_B:.*]] = fir.load %[[B]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
76+ ! CHECK: %[[PRIVATE_LOADED_B:.*]] = fir.load %[[B_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>
8077! CHECK: %[[PRIVATE_LOADED_B_addr:.*]] = fir.box_addr %[[PRIVATE_LOADED_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
8178! CHECK: %[[loaded_value:.*]] = fir.load %[[PRIVATE_LOADED_B_addr]] : !fir.ptr<i32>
8279! CHECK: acc.atomic.capture {
@@ -114,13 +111,15 @@ subroutine capture_with_convert_f32_to_i32()
114111
115112! CHECK-LABEL: func.func @_QPcapture_with_convert_f32_to_i32()
116113! CHECK: %[[K:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFcapture_with_convert_f32_to_i32Ek"}
114+ ! CHECK: %[[K_DECL:.*]]:2 = hlfir.declare %[[K]] {uniq_name = "_QFcapture_with_convert_f32_to_i32Ek"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
117115! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_f32_to_i32Ev"}
116+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_f32_to_i32Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
118117! CHECK: %[[CST:.*]] = arith.constant 3.140000e+00 : f32
119118! CHECK: %[[MUL:.*]] = arith.mulf %{{.*}}, %[[CST]] fastmath<contract> : f32
120119! CHECK: %[[CONV:.*]] = fir.convert %[[MUL]] : (f32) -> i32
121120! CHECK: acc.atomic.capture {
122- ! CHECK: acc.atomic.read %[[V]] = %[[K]] : !fir.ref<i32>, i32
123- ! CHECK: acc.atomic.write %[[K]] = %[[CONV]] : !fir.ref<i32>, i32
121+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[K_DECL]]#1 : !fir.ref<i32>, i32
122+ ! CHECK: acc.atomic.write %[[K_DECL]]#1 = %[[CONV]] : !fir.ref<i32>, i32
124123! CHECK: }
125124
126125subroutine array_ref_in_atomic_capture1
@@ -131,12 +130,14 @@ subroutine array_ref_in_atomic_capture1
131130 ! $acc end atomic
132131end subroutine array_ref_in_atomic_capture1
133132! CHECK-LABEL: func.func @_QParray_ref_in_atomic_capture1() {
134- ! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture1Ev"}
135- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture1Ex"}
136- ! CHECK: %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_1]], %{{.*}} : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>
133+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture1Ev"}
134+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFarray_ref_in_atomic_capture1Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
135+ ! CHECK: %[[X:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture1Ex"}
136+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]](%{{.*}}) {uniq_name = "_QFarray_ref_in_atomic_capture1Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)
137+ ! CHECK: %[[X_REF:.*]] = hlfir.designate %[[X_DECL]]#0 (%{{.*}}) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
137138! CHECK: acc.atomic.capture {
138- ! CHECK: acc.atomic.read %[[VAL_0]] = %[[VAL_5 ]] : !fir.ref<i32>, i32
139- ! CHECK: acc.atomic.update %[[VAL_5 ]] : !fir.ref<i32> {
139+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF ]] : !fir.ref<i32>, i32
140+ ! CHECK: acc.atomic.update %[[X_REF ]] : !fir.ref<i32> {
140141! CHECK: ^bb0(%[[VAL_7:.*]]: i32):
141142! CHECK: %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32
142143! CHECK: acc.yield %[[VAL_8]] : i32
@@ -151,16 +152,18 @@ subroutine array_ref_in_atomic_capture2
151152 ! $acc end atomic
152153end subroutine array_ref_in_atomic_capture2
153154! CHECK-LABEL: func.func @_QParray_ref_in_atomic_capture2() {
154- ! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture2Ev"}
155- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture2Ex"}
156- ! CHECK: %[[VAL_5:.*]] = fir.coordinate_of %[[VAL_1]], %{{.*}} : (!fir.ref<!fir.array<10xi32>>, i64) -> !fir.ref<i32>
155+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture2Ev"}
156+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFarray_ref_in_atomic_capture2Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
157+ ! CHECK: %[[X:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture2Ex"}
158+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]](%{{.*}}) {uniq_name = "_QFarray_ref_in_atomic_capture2Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)
159+ ! CHECK: %[[X_REF:.*]] = hlfir.designate %[[X_DECL]]#0 (%{{.*}}) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
157160! CHECK: acc.atomic.capture {
158- ! CHECK: acc.atomic.update %[[VAL_5 ]] : !fir.ref<i32> {
161+ ! CHECK: acc.atomic.update %[[X_REF ]] : !fir.ref<i32> {
159162! CHECK: ^bb0(%[[VAL_7:.*]]: i32):
160163! CHECK: %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32
161164! CHECK: acc.yield %[[VAL_8]] : i32
162165! CHECK: }
163- ! CHECK: acc.atomic.read %[[VAL_0]] = %[[VAL_5 ]] : !fir.ref<i32>, i32
166+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF ]] : !fir.ref<i32>, i32
164167! CHECK: }
165168
166169subroutine comp_ref_in_atomic_capture1
@@ -175,13 +178,14 @@ subroutine comp_ref_in_atomic_capture1
175178 ! $acc end atomic
176179end subroutine comp_ref_in_atomic_capture1
177180! CHECK-LABEL: func.func @_QPcomp_ref_in_atomic_capture1() {
178- ! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture1Ev"}
179- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture1Ex"}
180- ! CHECK: %[[VAL_2:.*]] = fir.field_index c, !fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>
181- ! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_2]] : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>, !fir.field) -> !fir.ref<i32>
181+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture1Ev"}
182+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcomp_ref_in_atomic_capture1Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
183+ ! CHECK: %[[X:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture1Ex"}
184+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcomp_ref_in_atomic_capture1Ex"} : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>) -> (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>, !fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>)
185+ ! CHECK: %[[C:.*]] = hlfir.designate %[[X_DECL]]#0{"c"} : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>) -> !fir.ref<i32>
182186! CHECK: acc.atomic.capture {
183- ! CHECK: acc.atomic.read %[[VAL_0]] = %[[VAL_3 ]] : !fir.ref<i32>, i32
184- ! CHECK: acc.atomic.update %[[VAL_3 ]] : !fir.ref<i32> {
187+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C ]] : !fir.ref<i32>, i32
188+ ! CHECK: acc.atomic.update %[[C ]] : !fir.ref<i32> {
185189! CHECK: ^bb0(%[[VAL_5:.*]]: i32):
186190! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32
187191! CHECK: acc.yield %[[VAL_6]] : i32
@@ -200,15 +204,16 @@ subroutine comp_ref_in_atomic_capture2
200204 ! $acc end atomic
201205end subroutine comp_ref_in_atomic_capture2
202206! CHECK-LABEL: func.func @_QPcomp_ref_in_atomic_capture2() {
203- ! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture2Ev"}
204- ! CHECK: %[[VAL_1:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture2Ex"}
205- ! CHECK: %[[VAL_2:.*]] = fir.field_index c, !fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>
206- ! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_2]] : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>, !fir.field) -> !fir.ref<i32>
207+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture2Ev"}
208+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcomp_ref_in_atomic_capture2Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
209+ ! CHECK: %[[X:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture2Ex"}
210+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcomp_ref_in_atomic_capture2Ex"} : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>) -> (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>, !fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>)
211+ ! CHECK: %[[C:.*]] = hlfir.designate %[[X_DECL]]#0{"c"} : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>) -> !fir.ref<i32>
207212! CHECK: acc.atomic.capture {
208- ! CHECK: acc.atomic.update %[[VAL_3 ]] : !fir.ref<i32> {
213+ ! CHECK: acc.atomic.update %[[C ]] : !fir.ref<i32> {
209214! CHECK: ^bb0(%[[VAL_5:.*]]: i32):
210215! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32
211216! CHECK: acc.yield %[[VAL_6]] : i32
212217! CHECK: }
213- ! CHECK: acc.atomic.read %[[VAL_0]] = %[[VAL_3 ]] : !fir.ref<i32>, i32
218+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C ]] : !fir.ref<i32>, i32
214219! CHECK: }
0 commit comments