1 ! RUN: %flang_fc1 -emit-fir -fopenacc %s -o - | FileCheck %s
3 ! This test checks the lowering of atomic capture
5 program acc_atomic_capture_test
8 !CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
9 !CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
10 !CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
11 !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: ^bb0(%[[ARG:.*]]: i32):
15 !CHECK: %[[result:.*]] = arith.addi %[[temp]], %[[ARG]] : i32
16 !CHECK: acc.yield %[[result]] : i32
26 !CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
27 !CHECK: acc.atomic.capture {
28 !CHECK: acc.atomic.update %[[Y]] : !fir.ref<i32> {
29 !CHECK: ^bb0(%[[ARG:.*]]: i32):
30 !CHECK: %[[result:.*]] = arith.muli %[[temp]], %[[ARG]] : i32
31 !CHECK: acc.yield %[[result]] : i32
33 !CHECK: acc.atomic.read %[[X]] = %[[Y]] : !fir.ref<i32>
41 !CHECK: %[[constant_20:.*]] = arith.constant 20 : i32
42 !CHECK: %[[constant_8:.*]] = arith.constant 8 : i32
43 !CHECK: %[[temp:.*]] = fir.load %[[X]] : !fir.ref<i32>
44 !CHECK: %[[result:.*]] = arith.subi %[[constant_8]], %[[temp]] : i32
45 !CHECK: %[[result_noreassoc:.*]] = fir.no_reassoc %[[result]] : i32
46 !CHECK: %[[result:.*]] = arith.addi %[[constant_20]], %[[result_noreassoc]] : i32
47 !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
60 subroutine pointers_in_atomic_capture()
61 !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>>>
65 !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>>>
69 !CHECK: %[[C:.*]] = fir.alloca i32 {bindc_name = "c", fir.target, uniq_name = "_QFpointers_in_atomic_captureEc"}
70 !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>>>
76 !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>>>
78 !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>>>
80 !CHECK: %[[PRIVATE_LOADED_B_addr:.*]] = fir.box_addr %[[PRIVATE_LOADED_B]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
81 !CHECK: %[[loaded_value:.*]] = fir.load %[[PRIVATE_LOADED_B_addr]] : !fir.ptr<i32>
82 !CHECK: acc.atomic.capture {
83 !CHECK: acc.atomic.update %[[loaded_A_addr]] : !fir.ptr<i32> {
84 !CHECK: ^bb0(%[[ARG:.*]]: i32):
85 !CHECK: %[[result:.*]] = arith.addi %[[ARG]], %[[loaded_value]] : i32
86 !CHECK: acc.yield %[[result]] : i32
88 !CHECK: acc.atomic.read %[[loaded_B_addr]] = %[[loaded_A_addr]] : !fir.ptr<i32>, i32
90 integer, pointer :: a
, b
91 integer, target
:: c
, d
102 subroutine capture_with_convert_f32_to_i32()
115 ! CHECK-LABEL: func.func @_QPcapture_with_convert_f32_to_i32()
116 ! CHECK: %[[K:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFcapture_with_convert_f32_to_i32Ek"}
117 ! CHECK: %[[V:.*]] = fir.alloca i32 {bindc_name = "v", uniq_name = "_QFcapture_with_convert_f32_to_i32Ev"}
118 ! CHECK: %[[CST:.*]] = arith.constant 3.140000e+00 : f32
119 ! CHECK: %[[MUL:.*]] = arith.mulf %{{.*}}, %[[CST]] fastmath<contract> : f32
120 ! CHECK: %[[CONV:.*]] = fir.convert %[[MUL]] : (f32) -> i32
121 ! 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