xref: /llvm-project/flang/test/Lower/OpenACC/acc-host-data.f90 (revision fe408eb5845737f8d6bf5eeed0aca8651991e687)
1! This test checks lowering of OpenACC host_data directive.
2
3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
4
5subroutine acc_host_data()
6  real, dimension(10) :: a
7  logical :: ifCondition = .TRUE.
8
9! CHECK: %[[A:.*]] = fir.alloca !fir.array<10xf32> {bindc_name = "a", uniq_name = "_QFacc_host_dataEa"}
10! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]
11! CHECK: %[[IFCOND:.*]] = fir.address_of(@_QFacc_host_dataEifcondition) : !fir.ref<!fir.logical<4>>
12! CHECK: %[[DECLIFCOND:.*]]:2 = hlfir.declare %[[IFCOND]]
13
14  !$acc host_data use_device(a)
15  !$acc end host_data
16
17! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
18! CHECK: %[[DA:.*]] = acc.use_device varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<10xf32>> {name = "a"}
19! CHECK: acc.host_data dataOperands(%[[DA]] : !fir.ref<!fir.array<10xf32>>)
20
21  !$acc host_data use_device(a) if_present
22  !$acc end host_data
23
24! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
25! CHECK: %[[DA:.*]] = acc.use_device varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<10xf32>> {name = "a"}
26! CHECK: acc.host_data dataOperands(%[[DA]] : !fir.ref<!fir.array<10xf32>>) {
27! CHECK: } attributes {ifPresent}
28
29  !$acc host_data use_device(a) if(ifCondition)
30  !$acc end host_data
31
32! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
33! CHECK: %[[DA:.*]] = acc.use_device varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<10xf32>> {name = "a"}
34! CHECK: %[[LOAD_IFCOND:.*]] = fir.load %[[DECLIFCOND]]#0 : !fir.ref<!fir.logical<4>>
35! CHECK: %[[IFCOND_I1:.*]] = fir.convert %[[LOAD_IFCOND]] : (!fir.logical<4>) -> i1
36! CHECK: acc.host_data if(%[[IFCOND_I1]]) dataOperands(%[[DA]] : !fir.ref<!fir.array<10xf32>>)
37
38  !$acc host_data use_device(a) if(.true.)
39  !$acc end host_data
40
41! CHECK: %[[BOUND:.*]] = acc.bounds lowerbound(%{{.*}} : index) upperbound(%{{.*}} : index) stride(%{{.*}} : index) startIdx(%{{.*}} : index)
42! CHECK: %[[DA:.*]] = acc.use_device varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) bounds(%[[BOUND]]) -> !fir.ref<!fir.array<10xf32>> {name = "a"}
43! CHECK: acc.host_data dataOperands(%[[DA]] : !fir.ref<!fir.array<10xf32>>)
44
45  !$acc host_data use_device(a) if(.false.)
46    a = 1.0
47  !$acc end host_data
48
49! CHECK-NOT: acc.host_data
50! CHECK: hlfir.assign %{{.*}} to %[[DECLA]]#0
51
52end subroutine
53