[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / flang / test / Lower / OpenACC / acc-atomic-write.f90
blobe68aaac3d38581adca67b3f5586dab22c105f857
1 ! RUN: bbc --use-desc-for-alloc=false -fopenacc -emit-fir %s -o - | FileCheck %s
3 ! This test checks the lowering of atomic write
5 !CHECK: func @_QQmain() attributes {fir.bindc_name = "acc_atomic_write_test"} {
6 !CHECK: %[[VAR_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
7 !CHECK: %[[VAR_Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
8 !CHECK: %[[CONST_7:.*]] = arith.constant 7 : i32
9 !CHECK: {{.*}} = fir.load %[[VAR_Y]] : !fir.ref<i32>
10 !CHECK: %[[VAR_7y:.*]] = arith.muli %[[CONST_7]], {{.*}} : i32
11 !CHECK: acc.atomic.write %[[VAR_X]] = %[[VAR_7y]] : !fir.ref<i32>, i32
12 !CHECK: return
13 !CHECK: }
15 program acc_atomic_write_test
16 integer :: x, y
18 !$acc atomic write
19 x = 7 * y
21 end program acc_atomic_write_test
23 ! Test lowering atomic read for pointer variables.
25 !CHECK-LABEL: func.func @_QPatomic_write_pointer() {
26 !CHECK: %[[VAL_0:.*]] = fir.alloca !fir.box<!fir.ptr<i32>> {bindc_name = "x", uniq_name = "_QFatomic_write_pointerEx"}
27 !CHECK: %[[VAL_1:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFatomic_write_pointerEx.addr"}
28 !CHECK: %[[VAL_2:.*]] = fir.zero_bits !fir.ptr<i32>
29 !CHECK: fir.store %[[VAL_2]] to %[[VAL_1]] : !fir.ref<!fir.ptr<i32>>
30 !CHECK: %[[VAL_3:.*]] = arith.constant 1 : i32
31 !CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.ptr<i32>>
32 !CHECK: acc.atomic.write %[[VAL_4]] = %[[VAL_3]] : !fir.ptr<i32>, i32
33 !CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32
34 !CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.ptr<i32>>
35 !CHECK: fir.store %[[VAL_5]] to %[[VAL_6]] : !fir.ptr<i32>
36 !CHECK: return
37 !CHECK: }
39 subroutine atomic_write_pointer()
40 integer, pointer :: x
42 !$acc atomic write
43 x = 1
45 x = 2
46 end subroutine
48 !CHECK-LABEL: func.func @_QPatomic_write_typed_assign
49 !CHECK: %[[VAR:.*]] = fir.alloca f32 {bindc_name = "r2", uniq_name = "{{.*}}r2"}
50 !CHECK: %[[CST:.*]] = arith.constant 0.000000e+00 : f32
51 !CHECK: acc.atomic.write %[[VAR]] = %[[CST]] : !fir.ref<f32>, f32
53 subroutine atomic_write_typed_assign
54 real :: r2
55 !$acc atomic write
56 r2 = 0
57 end subroutine