@@ -11,7 +11,7 @@ program acc_atomic_capture_test
1111! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %2 {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1212! CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
1313! CHECK: acc.atomic.capture {
14- ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
14+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>, !fir.ref<i32>, i32
1515! CHECK: acc.atomic.update %[[Y_DECL]]#1 : !fir.ref<i32> {
1616! CHECK: ^bb0(%[[ARG:.*]]: i32):
1717! CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[ARG]] : i32
@@ -32,7 +32,7 @@ program acc_atomic_capture_test
3232! CHECK: %[[result:.*]] = arith.muli %[[temp]], %[[ARG]] : i32
3333! CHECK: acc.yield %[[result]] : i32
3434! CHECK: }
35- ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
35+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>, !fir.ref<i32>, i32
3636! CHECK: }
3737
3838 ! $acc atomic capture
@@ -47,7 +47,7 @@ program acc_atomic_capture_test
4747! CHECK: %[[result_noreassoc:.*]] = hlfir.no_reassoc %[[result]] : i32
4848! CHECK: %[[result:.*]] = arith.addi %[[constant_20]], %[[result_noreassoc]] : i32
4949! CHECK: acc.atomic.capture {
50- ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>
50+ ! CHECK: acc.atomic.read %[[X_DECL]]#1 = %[[Y_DECL]]#1 : !fir.ref<i32>, !fir.ref<i32>, i32
5151! CHECK: acc.atomic.write %[[Y_DECL]]#1 = %[[result]] : !fir.ref<i32>, i32
5252! CHECK: }
5353
@@ -82,7 +82,7 @@ subroutine pointers_in_atomic_capture()
8282! CHECK: %[[result:.*]] = arith.addi %[[ARG]], %[[loaded_value]] : i32
8383! CHECK: acc.yield %[[result]] : i32
8484! CHECK: }
85- ! CHECK: acc.atomic.read %[[loaded_B_addr]] = %[[loaded_A_addr]] : !fir.ptr<i32>, i32
85+ ! CHECK: acc.atomic.read %[[loaded_B_addr]] = %[[loaded_A_addr]] : !fir.ptr<i32>, !fir.ptr<i32>, i32
8686! CHECK: }
8787 integer , pointer :: a, b
8888 integer , target :: c, d
@@ -118,10 +118,95 @@ subroutine capture_with_convert_f32_to_i32()
118118! CHECK: %[[MUL:.*]] = arith.mulf %{{.*}}, %[[CST]] fastmath<contract> : f32
119119! CHECK: %[[CONV:.*]] = fir.convert %[[MUL]] : (f32) -> i32
120120! CHECK: acc.atomic.capture {
121- ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[K_DECL]]#1 : !fir.ref<i32>, i32
121+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[K_DECL]]#1 : !fir.ref<i32>, !fir.ref<i32>, i32
122122! CHECK: acc.atomic.write %[[K_DECL]]#1 = %[[CONV]] : !fir.ref<i32>, i32
123123! CHECK: }
124124
125+ subroutine capture_with_convert_i32_to_f64 ()
126+ real (8 ) :: x
127+ integer :: v
128+ x = 1.0
129+ v = 0
130+ ! $acc atomic capture
131+ v = x
132+ x = v
133+ ! $acc end atomic
134+ end subroutine capture_with_convert_i32_to_f64
135+
136+ ! CHECK-LABEL: func.func @_QPcapture_with_convert_i32_to_f64()
137+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_i32_to_f64Ev"}
138+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_i32_to_f64Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
139+ ! CHECK: %[[X:.*]] = fir.alloca f64 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_i32_to_f64Ex"}
140+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_i32_to_f64Ex"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
141+ ! CHECK: %[[LOAD:.*]] = fir.load %[[V_DECL]]#0 : !fir.ref<i32>
142+ ! CHECK: %[[CONV:.*]] = fir.convert %[[LOAD]] : (i32) -> f64
143+ ! CHECK: acc.atomic.capture {
144+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_DECL]]#1 : !fir.ref<i32>, !fir.ref<f64>, f64
145+ ! CHECK: acc.atomic.write %[[X_DECL]]#1 = %[[CONV]] : !fir.ref<f64>, f64
146+ ! CHECK: }
147+
148+ subroutine capture_with_convert_f64_to_i32 ()
149+ integer :: x
150+ real (8 ) :: v
151+ x = 1
152+ v = 0
153+ ! $acc atomic capture
154+ x = v * v
155+ v = x
156+ ! $acc end atomic
157+ end subroutine capture_with_convert_f64_to_i32
158+
159+ ! CHECK-LABEL: func.func @_QPcapture_with_convert_f64_to_i32()
160+ ! CHECK: %[[V:.*]] = fir.alloca f64 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_f64_to_i32Ev"}
161+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_f64_to_i32Ev"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
162+ ! CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_f64_to_i32Ex"}
163+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_f64_to_i32Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
164+ ! CHECK: %c1_i32 = arith.constant 1 : i32
165+ ! CHECK: hlfir.assign %c1_i32 to %[[X_DECL]]#0 : i32, !fir.ref<i32>
166+ ! CHECK: %[[CST:.*]] = arith.constant 0.000000e+00 : f64
167+ ! CHECK: hlfir.assign %[[CST]] to %[[V_DECL]]#0 : f64, !fir.ref<f64>
168+ ! CHECK: %[[LOAD:.*]] = fir.load %[[V_DECL]]#0 : !fir.ref<f64>
169+ ! CHECK: acc.atomic.capture {
170+ ! CHECK: acc.atomic.update %[[X_DECL]]#1 : !fir.ref<i32> {
171+ ! CHECK: ^bb0(%arg0: i32):
172+ ! CHECK: %[[MUL:.*]] = arith.mulf %[[LOAD]], %[[LOAD]] fastmath<contract> : f64
173+ ! CHECK: %[[CONV:.*]] = fir.convert %[[MUL]] : (f64) -> i32
174+ ! CHECK: acc.yield %[[CONV]] : i32
175+ ! CHECK: }
176+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_DECL]]#1 : !fir.ref<f64>, !fir.ref<i32>, i32
177+ ! CHECK: }
178+
179+ subroutine capture_with_convert_i32_to_f32 ()
180+ real (4 ) :: x
181+ integer :: v
182+ x = 1.0
183+ v = 0
184+ ! $acc atomic capture
185+ v = x
186+ x = x + v
187+ ! $acc end atomic
188+ end subroutine capture_with_convert_i32_to_f32
189+
190+ ! CHECK-LABEL: func.func @_QPcapture_with_convert_i32_to_f32()
191+ ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_i32_to_f32Ev"}
192+ ! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_i32_to_f32Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
193+ ! CHECK: %[[X:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_i32_to_f32Ex"}
194+ ! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_i32_to_f32Ex"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
195+ ! CHECK: %[[CST:.*]] = arith.constant 1.000000e+00 : f32
196+ ! CHECK: hlfir.assign %[[CST]] to %[[X_DECL]]#0 : f32, !fir.ref<f32>
197+ ! CHECK: %c0_i32 = arith.constant 0 : i32
198+ ! CHECK: hlfir.assign %c0_i32 to %[[V_DECL]]#0 : i32, !fir.ref<i32>
199+ ! CHECK: %[[LOAD:.*]] = fir.load %[[V_DECL]]#0 : !fir.ref<i32>
200+ ! CHECK: acc.atomic.capture {
201+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_DECL]]#1 : !fir.ref<i32>, !fir.ref<f32>, f32
202+ ! CHECK: acc.atomic.update %[[X_DECL]]#1 : !fir.ref<f32> {
203+ ! CHECK: ^bb0(%arg0: f32):
204+ ! CHECK: %[[CONV:.*]] = fir.convert %[[LOAD]] : (i32) -> f32
205+ ! CHECK: %[[ADD:.*]] = arith.addf %arg0, %[[CONV]] fastmath<contract> : f32
206+ ! CHECK: acc.yield %[[ADD]] : f32
207+ ! CHECK: }
208+ ! CHECK: }
209+
125210subroutine array_ref_in_atomic_capture1
126211 integer :: x(10 ), v
127212 ! $acc atomic capture
@@ -136,7 +221,7 @@ end subroutine array_ref_in_atomic_capture1
136221! 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>>)
137222! CHECK: %[[X_REF:.*]] = hlfir.designate %[[X_DECL]]#0 (%{{.*}}) : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>
138223! CHECK: acc.atomic.capture {
139- ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF]] : !fir.ref<i32>, i32
224+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF]] : !fir.ref<i32>, !fir.ref<i32>, i32
140225! CHECK: acc.atomic.update %[[X_REF]] : !fir.ref<i32> {
141226! CHECK: ^bb0(%[[VAL_7:.*]]: i32):
142227! CHECK: %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32
@@ -163,7 +248,7 @@ end subroutine array_ref_in_atomic_capture2
163248! CHECK: %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32
164249! CHECK: acc.yield %[[VAL_8]] : i32
165250! CHECK: }
166- ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF]] : !fir.ref<i32>, i32
251+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[X_REF]] : !fir.ref<i32>, !fir.ref<i32>, i32
167252! CHECK: }
168253
169254subroutine comp_ref_in_atomic_capture1
@@ -184,7 +269,7 @@ end subroutine comp_ref_in_atomic_capture1
184269! 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}>>)
185270! CHECK: %[[C:.*]] = hlfir.designate %[[X_DECL]]#0{"c"} : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>) -> !fir.ref<i32>
186271! CHECK: acc.atomic.capture {
187- ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C]] : !fir.ref<i32>, i32
272+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C]] : !fir.ref<i32>, !fir.ref<i32>, i32
188273! CHECK: acc.atomic.update %[[C]] : !fir.ref<i32> {
189274! CHECK: ^bb0(%[[VAL_5:.*]]: i32):
190275! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32
@@ -215,5 +300,5 @@ end subroutine comp_ref_in_atomic_capture2
215300! CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32
216301! CHECK: acc.yield %[[VAL_6]] : i32
217302! CHECK: }
218- ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C]] : !fir.ref<i32>, i32
303+ ! CHECK: acc.atomic.read %[[V_DECL]]#1 = %[[C]] : !fir.ref<i32>, !fir.ref<i32>, i32
219304! CHECK: }
0 commit comments