[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / flang / test / Lower / OpenACC / acc-atomic-capture.f90
blob59c16cf61acf71805017b2283cbd9aaa3e5a38c5
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
6 integer :: x, y
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
17 !CHECK: }
18 !CHECK: }
20 !$acc atomic capture
21 x = y
22 y = x + y
23 !$acc end atomic
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
32 !CHECK: }
33 !CHECK: acc.atomic.read %[[X]] = %[[Y]] : !fir.ref<i32>
34 !CHECK: }
36 !$acc atomic capture
37 y = x * y
38 x = y
39 !$acc end atomic
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
50 !CHECK: }
52 !$acc atomic capture
53 x = y
54 y = 2 * 10 + (8 - x)
55 !$acc end atomic
56 end program
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
87 !CHECK: }
88 !CHECK: acc.atomic.read %[[loaded_B_addr]] = %[[loaded_A_addr]] : !fir.ptr<i32>, i32
89 !CHECK: }
90 integer, pointer :: a, b
91 integer, target :: c, d
92 a=>c
93 b=>d
95 !$acc atomic capture
96 a = a + b
97 b = a
98 !$acc end atomic
99 end subroutine
102 subroutine capture_with_convert_f32_to_i32()
103 implicit none
104 integer :: k, v, i
106 k = 1
107 v = 0
109 !$acc atomic capture
110 v = k
111 k = (i + 1) * 3.14
112 !$acc end atomic
113 end subroutine
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
124 ! CHECK: }