brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.4 KiB · ccdd4d3 Raw
370 lines · plain
1! RUN: %flang_fc1 -I nowhere -emit-hlfir -fopenacc %s -o - | FileCheck %s2 3! This test checks the lowering of atomic capture4 5program acc_atomic_capture_test6    integer :: x, y7 8!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}9!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)10!CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}11!CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)12!CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>13!CHECK: acc.atomic.capture {14!CHECK: acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i3215!CHECK: acc.atomic.update %[[Y_DECL]]#0 : !fir.ref<i32> {16!CHECK: ^bb0(%[[ARG:.*]]: i32):17!CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[ARG]] : i3218!CHECK: acc.yield %[[result]] : i3219!CHECK: }20!CHECK: }21 22    !$acc atomic capture23        x = y24        y = x + y25    !$acc end atomic26 27 28!CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>29!CHECK: acc.atomic.capture {30!CHECK: acc.atomic.update %[[Y_DECL]]#0 : !fir.ref<i32> {31!CHECK: ^bb0(%[[ARG:.*]]: i32):32!CHECK: %[[result:.*]] = arith.muli %[[temp]], %[[ARG]] : i3233!CHECK: acc.yield %[[result]] : i3234!CHECK: }35!CHECK: acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i3236!CHECK: }37 38    !$acc atomic capture39        y = x * y40        x = y41    !$acc end atomic42 43!CHECK: %[[constant_20:.*]] = arith.constant 20 : i3244!CHECK: %[[constant_8:.*]] = arith.constant 8 : i3245!CHECK: %[[temp:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>46!CHECK: %[[result:.*]] = arith.subi %[[constant_8]], %[[temp]] : i3247!CHECK: %[[result_noreassoc:.*]] = hlfir.no_reassoc %[[result]] : i3248!CHECK: %[[result:.*]] = arith.addi %[[constant_20]], %[[result_noreassoc]] : i3249!CHECK: acc.atomic.capture {50!CHECK: acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i3251!CHECK: acc.atomic.write %[[Y_DECL]]#0 = %[[result]] : !fir.ref<i32>, i3252!CHECK: }53 54    !$acc atomic capture55        x = y56        y = 2 * 10 + (8 - x)57    !$acc end atomic58end program59 60 61 62subroutine pointers_in_atomic_capture()63!CHECK: %[[A:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "a", uniq_name = "_QFpointers_in_atomic_captureEa"}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>>>)65!CHECK: %[[B:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "b", uniq_name = "_QFpointers_in_atomic_captureEb"}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>>>)67!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>)69!CHECK: %[[D:.*]] = fir.alloca i32 {bindc_name = "d", fir.target, uniq_name = "_QFpointers_in_atomic_captureEd"}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>>>73!CHECK: %[[loaded_A_addr:.*]] = fir.box_addr %[[loaded_A]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>74!CHECK: %[[loaded_B:.*]] = fir.load %[[B_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>75!CHECK: %[[loaded_B_addr:.*]] = fir.box_addr %[[loaded_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>76!CHECK: %[[PRIVATE_LOADED_B:.*]] = fir.load %[[B_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<i32>>>77!CHECK: %[[PRIVATE_LOADED_B_addr:.*]] = fir.box_addr %[[PRIVATE_LOADED_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>78!CHECK: %[[loaded_value:.*]] = fir.load %[[PRIVATE_LOADED_B_addr]] : !fir.ptr<i32>79!CHECK: acc.atomic.capture   {80!CHECK: acc.atomic.update %[[loaded_A_addr]] : !fir.ptr<i32> {81!CHECK: ^bb0(%[[ARG:.*]]: i32):82!CHECK: %[[result:.*]] = arith.addi %[[ARG]], %[[loaded_value]] : i3283!CHECK: acc.yield %[[result]] : i3284!CHECK: }85!CHECK: acc.atomic.read %[[loaded_B_addr]] = %[[loaded_A_addr]] : !fir.ptr<i32>, !fir.ptr<i32>, i3286!CHECK: }87    integer, pointer :: a, b88    integer, target :: c, d89    a=>c90    b=>d91 92    !$acc atomic capture93        a = a + b94        b = a95    !$acc end atomic96end subroutine97 98 99subroutine capture_with_convert_f32_to_i32()100  implicit none101  integer :: k, v, i102 103  k = 1104  v = 0105 106  !$acc atomic capture107  v = k108  k = (i + 1) * 3.14109  !$acc end atomic110end subroutine111 112! CHECK-LABEL: func.func @_QPcapture_with_convert_f32_to_i32()113! 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>)115! 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>)117! CHECK: %[[CST:.*]] = arith.constant 3.140000e+00 : f32118! CHECK: %[[MUL:.*]] = arith.mulf %{{.*}}, %[[CST]] fastmath<contract> : f32119! CHECK: %[[CONV:.*]] = fir.convert %[[MUL]] : (f32) -> i32120! CHECK: acc.atomic.capture {121! CHECK:   acc.atomic.read %[[V_DECL]]#0 = %[[K_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i32122! CHECK:   acc.atomic.write %[[K_DECL]]#0 = %[[CONV]] : !fir.ref<i32>, i32123! CHECK: }124 125subroutine capture_with_convert_i32_to_f64()126  real(8) :: x127  integer :: v, u128  x = 1.0129  v = 0130  u = 1131  !$acc atomic capture132  v = x133  x = u134  !$acc end atomic135end subroutine capture_with_convert_i32_to_f64136 137! CHECK-LABEL: func.func @_QPcapture_with_convert_i32_to_f64()138! CHECK: %[[U:.*]] = fir.alloca i32 {bindc_name = "u", uniq_name = "_QFcapture_with_convert_i32_to_f64Eu"}139! CHECK: %[[U_DECL:.*]]:2 = hlfir.declare %[[U]] {uniq_name = "_QFcapture_with_convert_i32_to_f64Eu"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)140! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_i32_to_f64Ev"}141! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_i32_to_f64Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)142! CHECK: %[[X:.*]] = fir.alloca f64 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_i32_to_f64Ex"}143! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_i32_to_f64Ex"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)144! CHECK: %[[CST:.*]] = arith.constant 1.000000e+00 : f64145! CHECK: hlfir.assign %[[CST]] to %[[X_DECL]]#0 : f64, !fir.ref<f64>146! CHECK: %c0_i32 = arith.constant 0 : i32147! CHECK: hlfir.assign %c0_i32 to %[[V_DECL]]#0 : i32, !fir.ref<i32>148! CHECK: %c1_i32 = arith.constant 1 : i32149! CHECK: hlfir.assign %c1_i32 to %[[U_DECL]]#0 : i32, !fir.ref<i32>150! CHECK: %[[LOAD:.*]] = fir.load %[[U_DECL]]#0 : !fir.ref<i32>151! CHECK: %[[CONV:.*]] = fir.convert %[[LOAD]] : (i32) -> f64152! CHECK: acc.atomic.capture {153! CHECK:   acc.atomic.read %[[V_DECL]]#0 = %[[X_DECL]]#0 : !fir.ref<i32>, !fir.ref<f64>, f64154! CHECK:   acc.atomic.write %[[X_DECL]]#0 = %[[CONV]] : !fir.ref<f64>, f64155! CHECK: }156 157subroutine capture_with_convert_f64_to_i32()158  integer :: x159  real(8) :: v160  x = 1161  v = 0162  !$acc atomic capture163  x = x * 2.0_8164  v = x165  !$acc end atomic166end subroutine capture_with_convert_f64_to_i32167 168! CHECK-LABEL: func.func @_QPcapture_with_convert_f64_to_i32()169! CHECK: %[[V:.*]] = fir.alloca f64 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_f64_to_i32Ev"}170! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_f64_to_i32Ev"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)171! CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_f64_to_i32Ex"}172! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_f64_to_i32Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)173! CHECK: %c1_i32 = arith.constant 1 : i32174! CHECK: hlfir.assign %c1_i32 to %[[X_DECL]]#0 : i32, !fir.ref<i32>175! CHECK: %[[CST:.*]] = arith.constant 2.000000e+00 : f64176! CHECK: acc.atomic.capture {177! CHECK:   acc.atomic.update %[[X_DECL]]#0 : !fir.ref<i32> {178! CHECK:   ^bb0(%[[ARG:.*]]: i32):179! CHECK:     %[[CONV_ARG:.*]] = fir.convert %[[ARG]] : (i32) -> f64180! CHECK:     %[[MUL:.*]] = arith.mulf %[[CONV_ARG]], %[[CST]] fastmath<contract> : f64181! CHECK:     %[[CONV_MUL:.*]] = fir.convert %[[MUL]] : (f64) -> i32182! CHECK:     acc.yield %[[CONV_MUL]] : i32183! CHECK:   }184! CHECK:   acc.atomic.read %[[V_DECL]]#0 = %[[X_DECL]]#0 : !fir.ref<f64>, !fir.ref<i32>, i32185! CHECK: }186 187subroutine capture_with_convert_i32_to_f32()188  real(4) :: x189  integer :: v190  x = 1.0191  v = 0192  !$acc atomic capture193  v = x194  x = x + v195  !$acc end atomic196end subroutine capture_with_convert_i32_to_f32197 198! CHECK-LABEL: func.func @_QPcapture_with_convert_i32_to_f32()199! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_i32_to_f32Ev"}200! CHECK: %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcapture_with_convert_i32_to_f32Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)201! CHECK: %[[X:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFcapture_with_convert_i32_to_f32Ex"}202! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFcapture_with_convert_i32_to_f32Ex"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)203! CHECK: %[[CST:.*]] = arith.constant 1.000000e+00 : f32204! CHECK: hlfir.assign %[[CST]] to %[[X_DECL]]#0 : f32, !fir.ref<f32>205! CHECK: %c0_i32 = arith.constant 0 : i32206! CHECK: hlfir.assign %c0_i32 to %[[V_DECL]]#0 : i32, !fir.ref<i32>207! CHECK: %[[LOAD:.*]] = fir.load %[[V_DECL]]#0 : !fir.ref<i32>208! CHECK: acc.atomic.capture {209! CHECK:   acc.atomic.read %[[V_DECL]]#0 = %[[X_DECL]]#0 : !fir.ref<i32>, !fir.ref<f32>, f32210! CHECK:   acc.atomic.update %[[X_DECL]]#0 : !fir.ref<f32> {211! CHECK:   ^bb0(%arg0: f32):212! CHECK:     %[[CONV:.*]] = fir.convert %[[LOAD]] : (i32) -> f32213! CHECK:     %[[ADD:.*]] = arith.addf %arg0, %[[CONV]] fastmath<contract> : f32214! CHECK:     acc.yield %[[ADD]] : f32215! CHECK:   }216! CHECK: }217 218subroutine array_ref_in_atomic_capture1219  integer :: x(10), v220  !$acc atomic capture221  v = x(7)222  x(7) = x(7) + 1223  !$acc end atomic224end subroutine array_ref_in_atomic_capture1225! CHECK-LABEL:   func.func @_QParray_ref_in_atomic_capture1() {226! CHECK:           %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture1Ev"}227! CHECK:           %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFarray_ref_in_atomic_capture1Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)228! CHECK:           %[[X:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture1Ex"}229! 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>>)230! CHECK:           %[[X_REF:.*]] = hlfir.designate %[[X_DECL]]#0 (%{{.*}})  : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>231! CHECK:           acc.atomic.capture {232! CHECK:             acc.atomic.read %[[V_DECL]]#0 = %[[X_REF]] : !fir.ref<i32>, !fir.ref<i32>, i32233! CHECK:             acc.atomic.update %[[X_REF]] : !fir.ref<i32> {234! CHECK:             ^bb0(%[[VAL_7:.*]]: i32):235! CHECK:               %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32236! CHECK:               acc.yield %[[VAL_8]] : i32237! CHECK:             }238! CHECK:           }239 240subroutine array_ref_in_atomic_capture2241  integer :: x(10), v242  !$acc atomic capture243  x(7) = x(7) + 1244  v = x(7)245  !$acc end atomic246end subroutine array_ref_in_atomic_capture2247! CHECK-LABEL:   func.func @_QParray_ref_in_atomic_capture2() {248! CHECK:           %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFarray_ref_in_atomic_capture2Ev"}249! CHECK:           %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFarray_ref_in_atomic_capture2Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)250! CHECK:           %[[X:.*]] = fir.alloca !fir.array<10xi32> {bindc_name = "x", uniq_name = "_QFarray_ref_in_atomic_capture2Ex"}251! 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>>)252! CHECK:           %[[X_REF:.*]] = hlfir.designate %[[X_DECL]]#0 (%{{.*}})  : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>253! CHECK:           acc.atomic.capture {254! CHECK:             acc.atomic.update %[[X_REF]] : !fir.ref<i32> {255! CHECK:             ^bb0(%[[VAL_7:.*]]: i32):256! CHECK:               %[[VAL_8:.*]] = arith.addi %[[VAL_7]], %{{.*}} : i32257! CHECK:               acc.yield %[[VAL_8]] : i32258! CHECK:             }259! CHECK:             acc.atomic.read %[[V_DECL]]#0 = %[[X_REF]] : !fir.ref<i32>, !fir.ref<i32>, i32260! CHECK:           }261 262subroutine comp_ref_in_atomic_capture1263  type t1264     integer :: c265  end type t1266  integer :: v267  type(t1) :: x268  !$acc atomic capture269  v = x%c270  x%c = x%c + 1271  !$acc end atomic272end subroutine comp_ref_in_atomic_capture1273! CHECK-LABEL:   func.func @_QPcomp_ref_in_atomic_capture1() {274! CHECK:           %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture1Ev"}275! CHECK:           %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcomp_ref_in_atomic_capture1Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)276! CHECK:           %[[X:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture1Ex"}277! 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}>>)278! CHECK:           %[[C:.*]] = hlfir.designate %[[X_DECL]]#0{"c"}   : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture1Tt1{c:i32}>>) -> !fir.ref<i32>279! CHECK:           acc.atomic.capture {280! CHECK:             acc.atomic.read %[[V_DECL]]#0 = %[[C]] : !fir.ref<i32>, !fir.ref<i32>, i32281! CHECK:             acc.atomic.update %[[C]] : !fir.ref<i32> {282! CHECK:             ^bb0(%[[VAL_5:.*]]: i32):283! CHECK:               %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32284! CHECK:               acc.yield %[[VAL_6]] : i32285! CHECK:             }286! CHECK:           }287 288subroutine comp_ref_in_atomic_capture2289  type t1290     integer :: c291  end type t1292  integer :: v293  type(t1) :: x294  !$acc atomic capture295  x%c = x%c + 1296  v = x%c297  !$acc end atomic298end subroutine comp_ref_in_atomic_capture2299! CHECK-LABEL:   func.func @_QPcomp_ref_in_atomic_capture2() {300! CHECK:           %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcomp_ref_in_atomic_capture2Ev"}301! CHECK:           %[[V_DECL:.*]]:2 = hlfir.declare %[[V]] {uniq_name = "_QFcomp_ref_in_atomic_capture2Ev"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)302! CHECK:           %[[X:.*]] = fir.alloca !fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}> {bindc_name = "x", uniq_name = "_QFcomp_ref_in_atomic_capture2Ex"}303! 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}>>)304! CHECK:           %[[C:.*]] = hlfir.designate %[[X_DECL]]#0{"c"}   : (!fir.ref<!fir.type<_QFcomp_ref_in_atomic_capture2Tt1{c:i32}>>) -> !fir.ref<i32>305! CHECK:           acc.atomic.capture {306! CHECK:             acc.atomic.update %[[C]] : !fir.ref<i32> {307! CHECK:             ^bb0(%[[VAL_5:.*]]: i32):308! CHECK:               %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %{{.*}} : i32309! CHECK:               acc.yield %[[VAL_6]] : i32310! CHECK:             }311! CHECK:             acc.atomic.read %[[V_DECL]]#0 = %[[C]] : !fir.ref<i32>, !fir.ref<i32>, i32312! CHECK:           }313 314! CHECK-LABEL:   func.func @_QPatomic_capture_with_associate() {315subroutine atomic_capture_with_associate316  interface317     integer function func(x)318       integer :: x319     end function func320  end interface321! CHECK:           %[[X_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFatomic_capture_with_associateEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)322! CHECK:           %[[Y_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFatomic_capture_with_associateEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)323! CHECK:           %[[Z_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFatomic_capture_with_associateEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)324  integer :: x, y, z325 326! CHECK:           %[[VAL_10:.*]]:3 = hlfir.associate %{{.*}} {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)327! CHECK:           %[[VAL_11:.*]] = fir.call @_QPfunc(%[[VAL_10]]#0) fastmath<contract> : (!fir.ref<i32>) -> i32328! CHECK:           acc.atomic.capture {329! CHECK:             acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i32330! CHECK:             acc.atomic.write %[[Y_DECL]]#0 = %[[VAL_11]] : !fir.ref<i32>, i32331! CHECK:           }332! CHECK:           hlfir.end_associate %[[VAL_10]]#1, %[[VAL_10]]#2 : !fir.ref<i32>, i1333  !$acc atomic capture334  x = y335  y = func(z + 1)336  !$acc end atomic337 338! CHECK:           %[[VAL_15:.*]]:3 = hlfir.associate %{{.*}} {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)339! CHECK:           %[[VAL_16:.*]] = fir.call @_QPfunc(%[[VAL_15]]#0) fastmath<contract> : (!fir.ref<i32>) -> i32340! CHECK:           acc.atomic.capture {341! CHECK:             acc.atomic.update %[[Y_DECL]]#0 : !fir.ref<i32> {342! CHECK:             ^bb0(%[[VAL_17:.*]]: i32):343! CHECK:               %[[VAL_18:.*]] = arith.muli %[[VAL_16]], %[[VAL_17]] : i32344! CHECK:               acc.yield %[[VAL_18]] : i32345! CHECK:             }346! CHECK:             acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i32347! CHECK:           }348! CHECK:           hlfir.end_associate %[[VAL_15]]#1, %[[VAL_15]]#2 : !fir.ref<i32>, i1349  !$acc atomic capture350  y = func(z + 1) * y351  x = y352  !$acc end atomic353 354! CHECK:           %[[VAL_22:.*]]:3 = hlfir.associate %{{.*}} {adapt.valuebyref} : (i32) -> (!fir.ref<i32>, !fir.ref<i32>, i1)355! CHECK:           %[[VAL_23:.*]] = fir.call @_QPfunc(%[[VAL_22]]#0) fastmath<contract> : (!fir.ref<i32>) -> i32356! CHECK:           acc.atomic.capture {357! CHECK:             acc.atomic.read %[[X_DECL]]#0 = %[[Y_DECL]]#0 : !fir.ref<i32>, !fir.ref<i32>, i32358! CHECK:             acc.atomic.update %[[Y_DECL]]#0 : !fir.ref<i32> {359! CHECK:             ^bb0(%[[VAL_24:.*]]: i32):360! CHECK:               %[[VAL_25:.*]] = arith.addi %[[VAL_23]], %[[VAL_24]] : i32361! CHECK:               acc.yield %[[VAL_25]] : i32362! CHECK:             }363! CHECK:           }364! CHECK:           hlfir.end_associate %[[VAL_22]]#1, %[[VAL_22]]#2 : !fir.ref<i32>, i1365  !$acc atomic capture366  x = y367  y = func(z + 1) + y368  !$acc end atomic369end subroutine atomic_capture_with_associate370