[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / flang / test / Lower / OpenACC / acc-atomic-update.f90
blob96e1d5e58e6f4826623da0d546eee0dccc1c2581
1 ! This test checks lowering of atomic and atomic update constructs
2 ! RUN: bbc --use-desc-for-alloc=false -fopenacc -emit-fir %s -o - | FileCheck %s
3 ! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -fopenacc %s -o - | FileCheck %s
5 program acc_atomic_update_test
6 integer :: x, y, z
7 integer, pointer :: a, b
8 integer, target :: c, d
9 integer(1) :: i1
11 a=>c
12 b=>d
14 !CHECK: func.func @_QQmain() attributes {fir.bindc_name = "acc_atomic_update_test"} {
15 !CHECK: %[[A:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "a", uniq_name = "_QFEa"}
16 !CHECK: %[[A_ADDR:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFEa.addr"}
17 !CHECK: %{{.*}} = fir.zero_bits !fir.ptr<i32>
18 !CHECK: fir.store %{{.*}} to %[[A_ADDR]] : !fir.ref<!fir.ptr<i32>>
19 !CHECK: %[[B:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "b", uniq_name = "_QFEb"}
20 !CHECK: %[[B_ADDR:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFEb.addr"}
21 !CHECK: %{{.*}} = fir.zero_bits !fir.ptr<i32>
22 !CHECK: fir.store %{{.*}} to %[[B_ADDR]] : !fir.ref<!fir.ptr<i32>>
23 !CHECK: %[[C_ADDR:.*]] = fir.address_of(@_QFEc) : !fir.ref<i32>
24 !CHECK: %[[D_ADDR:.*]] = fir.address_of(@_QFEd) : !fir.ref<i32>
25 !CHECK: %[[I1:.*]] = fir.alloca i8 {bindc_name = "i1", uniq_name = "_QFEi1"}
26 !CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
27 !CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
28 !CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"}
29 !CHECK: %{{.*}} = fir.convert %[[C_ADDR]] : (!fir.ref<i32>) -> !fir.ptr<i32>
30 !CHECK: fir.store %{{.*}} to %[[A_ADDR]] : !fir.ref<!fir.ptr<i32>>
31 !CHECK: %{{.*}} = fir.convert %[[D_ADDR]] : (!fir.ref<i32>) -> !fir.ptr<i32>
32 !CHECK: fir.store {{.*}} to %[[B_ADDR]] : !fir.ref<!fir.ptr<i32>>
33 !CHECK: %[[LOADED_A:.*]] = fir.load %[[A_ADDR]] : !fir.ref<!fir.ptr<i32>>
34 !CHECK: %[[LOADED_B:.*]] = fir.load %[[B_ADDR]] : !fir.ref<!fir.ptr<i32>>
35 !CHECK: %{{.*}} = fir.load %[[LOADED_B]] : !fir.ptr<i32>
36 !CHECK: acc.atomic.update %[[LOADED_A]] : !fir.ptr<i32> {
37 !CHECK: ^bb0(%[[ARG:.*]]: i32):
38 !CHECK: %[[RESULT:.*]] = arith.addi %[[ARG]], %{{.*}} : i32
39 !CHECK: acc.yield %[[RESULT]] : i32
40 !CHECK: }
41 !$acc atomic update
42 a = a + b
44 !CHECK: {{.*}} = arith.constant 1 : i32
45 !CHECK: acc.atomic.update %[[Y]] : !fir.ref<i32> {
46 !CHECK: ^bb0(%[[ARG:.*]]: i32):
47 !CHECK: %[[RESULT:.*]] = arith.addi %[[ARG]], {{.*}} : i32
48 !CHECK: acc.yield %[[RESULT]] : i32
49 !CHECK: }
50 !CHECK: %[[LOADED_X:.*]] = fir.load %[[X]] : !fir.ref<i32>
51 !CHECK: acc.atomic.update %[[Z]] : !fir.ref<i32> {
52 !CHECK: ^bb0(%[[ARG:.*]]: i32):
53 !CHECK: %[[RESULT:.*]] = arith.muli %[[LOADED_X]], %[[ARG]] : i32
54 !CHECK: acc.yield %[[RESULT]] : i32
55 !CHECK: }
56 !$acc atomic
57 y = y + 1
58 !$acc atomic update
59 z = x * z
61 !CHECK: %[[C1_VAL:.*]] = arith.constant 1 : i32
62 !CHECK: acc.atomic.update %[[I1]] : !fir.ref<i8> {
63 !CHECK: ^bb0(%[[VAL:.*]]: i8):
64 !CHECK: %[[CVT_VAL:.*]] = fir.convert %[[VAL]] : (i8) -> i32
65 !CHECK: %[[ADD_VAL:.*]] = arith.addi %[[CVT_VAL]], %[[C1_VAL]] : i32
66 !CHECK: %[[UPDATED_VAL:.*]] = fir.convert %[[ADD_VAL]] : (i32) -> i8
67 !CHECK: acc.yield %[[UPDATED_VAL]] : i8
68 !CHECK: }
69 !$acc atomic
70 i1 = i1 + 1
71 !$acc end atomic
72 !CHECK: return
73 !CHECK: }
74 end program acc_atomic_update_test