xref: /llvm-project/flang/test/Lower/OpenMP/common-block-map.f90 (revision cdb3ebf1e62df060767863e1e683409d6077ca6e)
1aec735cfSagozillon!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
2aec735cfSagozillon
3aec735cfSagozillon!CHECK: fir.global common @var_common_(dense<0> : vector<8xi8>) {{.*}} : !fir.array<8xi8>
4aec735cfSagozillon!CHECK: fir.global common @var_common_link_(dense<0> : vector<8xi8>) {{{.*}} omp.declare_target = #omp.declaretarget<device_type = (any), capture_clause = (link)>} : !fir.array<8xi8>
5aec735cfSagozillon
6aec735cfSagozillon!CHECK-LABEL: func.func @_QPmap_full_block
7aec735cfSagozillon!CHECK: %[[CB_ADDR:.*]] = fir.address_of(@var_common_) : !fir.ref<!fir.array<8xi8>>
8aec735cfSagozillon!CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[CB_ADDR]] : !fir.ref<!fir.array<8xi8>>, !fir.array<8xi8>) map_clauses(tofrom) capture(ByRef) -> !fir.ref<!fir.array<8xi8>> {name = "var_common"}
9aec735cfSagozillon!CHECK: omp.target map_entries(%[[MAP]] -> %[[MAP_ARG:.*]] : !fir.ref<!fir.array<8xi8>>) {
10aec735cfSagozillon!CHECK:    %[[CONV:.*]] = fir.convert %[[MAP_ARG]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
11aec735cfSagozillon!CHECK:    %[[INDEX:.*]] = arith.constant 0 : index
12aec735cfSagozillon!CHECK:    %[[COORD:.*]] = fir.coordinate_of %[[CONV]], %[[INDEX]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
13aec735cfSagozillon!CHECK:    %[[CONV2:.*]] = fir.convert %[[COORD]] : (!fir.ref<i8>) -> !fir.ref<i32>
14aec735cfSagozillon!CHECK:    %[[CB_MEMBER_1:.*]]:2 = hlfir.declare %[[CONV2]] {uniq_name = "_QFmap_full_blockEvar1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
15aec735cfSagozillon!CHECK:    %[[CONV3:.*]] = fir.convert %[[MAP_ARG]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
16aec735cfSagozillon!CHECK:    %[[INDEX2:.*]] = arith.constant 4 : index
17aec735cfSagozillon!CHECK:    %[[COORD2:.*]] = fir.coordinate_of %[[CONV3]], %[[INDEX2]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
18aec735cfSagozillon!CHECK:    %[[CONV4:.*]] = fir.convert %[[COORD2]] : (!fir.ref<i8>) -> !fir.ref<i32>
19aec735cfSagozillon!CHECK:    %[[CB_MEMBER_2:.*]]:2 = hlfir.declare %[[CONV4]] {uniq_name = "_QFmap_full_blockEvar2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
20aec735cfSagozillonsubroutine map_full_block
21aec735cfSagozillon    implicit none
22aec735cfSagozillon    common /var_common/ var1, var2
23aec735cfSagozillon    integer :: var1, var2
24aec735cfSagozillon!$omp target map(tofrom: /var_common/)
25aec735cfSagozillon    var1 = var1 + 20
26aec735cfSagozillon    var2 = var2 + 30
27aec735cfSagozillon!$omp end target
28aec735cfSagozillonend
29aec735cfSagozillon
30aec735cfSagozillon!CHECK-LABEL: @_QPmap_mix_of_members
31aec735cfSagozillon!CHECK: %[[COMMON_BLOCK:.*]] = fir.address_of(@var_common_) : !fir.ref<!fir.array<8xi8>>
32aec735cfSagozillon!CHECK: %[[CB_CONV:.*]] = fir.convert %[[COMMON_BLOCK]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
33aec735cfSagozillon!CHECK: %[[INDEX:.*]] = arith.constant 0 : index
34aec735cfSagozillon!CHECK: %[[COORD:.*]] = fir.coordinate_of %[[CB_CONV]], %[[INDEX]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
35aec735cfSagozillon!CHECK: %[[CONV:.*]] = fir.convert %[[COORD]] : (!fir.ref<i8>) -> !fir.ref<i32>
36aec735cfSagozillon!CHECK: %[[CB_MEMBER_1:.*]]:2 = hlfir.declare %[[CONV]] {uniq_name = "_QFmap_mix_of_membersEvar1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
37aec735cfSagozillon!CHECK: %[[CB_CONV:.*]] = fir.convert %[[COMMON_BLOCK]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
38aec735cfSagozillon!CHECK: %[[INDEX:.*]] = arith.constant 4 : index
39aec735cfSagozillon!CHECK: %[[COORD:.*]] = fir.coordinate_of %[[CB_CONV]], %[[INDEX]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
40aec735cfSagozillon!CHECK: %[[CONV:.*]] = fir.convert %[[COORD]] : (!fir.ref<i8>) -> !fir.ref<i32>
41aec735cfSagozillon!CHECK: %[[CB_MEMBER_2:.*]]:2 = hlfir.declare %[[CONV]] {uniq_name = "_QFmap_mix_of_membersEvar2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
42*f4cf93fbSagozillon!CHECK: %[[MAP_EXP:.*]] = omp.map.info var_ptr(%[[CB_MEMBER_2]]#1 : !fir.ref<i32>, i32) map_clauses(tofrom) capture(ByRef) -> !fir.ref<i32> {name = "var2"}
43aec735cfSagozillon!CHECK: %[[MAP_IMP:.*]] = omp.map.info var_ptr(%[[CB_MEMBER_1]]#1 : !fir.ref<i32>, i32) map_clauses(implicit, exit_release_or_enter_alloc) capture(ByCopy) -> !fir.ref<i32> {name = "var1"}
44aec735cfSagozillon!CHECK: omp.target map_entries(%[[MAP_EXP]] -> %[[ARG_EXP:.*]], %[[MAP_IMP]] -> %[[ARG_IMP:.*]] : !fir.ref<i32>, !fir.ref<i32>) {
45aec735cfSagozillon!CHECK:  %[[EXP_MEMBER:.*]]:2 = hlfir.declare %[[ARG_EXP]] {uniq_name = "_QFmap_mix_of_membersEvar2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
46aec735cfSagozillon!CHECK:  %[[IMP_MEMBER:.*]]:2 = hlfir.declare %[[ARG_IMP]] {uniq_name = "_QFmap_mix_of_membersEvar1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
47aec735cfSagozillonsubroutine map_mix_of_members
48aec735cfSagozillon    implicit none
49aec735cfSagozillon    common /var_common/ var1, var2
50aec735cfSagozillon    integer :: var1, var2
51aec735cfSagozillon
52aec735cfSagozillon!$omp target map(tofrom: var2)
53aec735cfSagozillon  var2 = var1
54aec735cfSagozillon!$omp end target
55aec735cfSagozillonend
56aec735cfSagozillon
57aec735cfSagozillon!CHECK-LABEL: @_QQmain
58aec735cfSagozillon!CHECK: %[[DECL_TAR_CB:.*]] = fir.address_of(@var_common_link_) : !fir.ref<!fir.array<8xi8>>
59aec735cfSagozillon!CHECK: %[[MAP_DECL_TAR_CB:.*]] = omp.map.info var_ptr(%[[DECL_TAR_CB]] : !fir.ref<!fir.array<8xi8>>, !fir.array<8xi8>) map_clauses(tofrom) capture(ByRef) -> !fir.ref<!fir.array<8xi8>> {name = "var_common_link"}
60aec735cfSagozillon!CHECK: omp.target map_entries(%[[MAP_DECL_TAR_CB]] -> %[[MAP_DECL_TAR_ARG:.*]] : !fir.ref<!fir.array<8xi8>>) {
61aec735cfSagozillon!CHECK:  %[[CONV:.*]] = fir.convert %[[MAP_DECL_TAR_ARG]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
62aec735cfSagozillon!CHECK:  %[[INDEX:.*]] = arith.constant 0 : index
63aec735cfSagozillon!CHECK:  %[[COORD:.*]] = fir.coordinate_of %[[CONV]], %[[INDEX]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
64aec735cfSagozillon!CHECK:  %[[CONV:.*]] = fir.convert %[[COORD]] : (!fir.ref<i8>) -> !fir.ref<i32>
65aec735cfSagozillon!CHECK:  %[[MEMBER_ONE:.*]]:2 = hlfir.declare %[[CONV]] {uniq_name = "_QFElink1"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
66aec735cfSagozillon!CHECK:  %[[CONV:.*]] = fir.convert %[[MAP_DECL_TAR_ARG]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
67aec735cfSagozillon!CHECK:  %[[INDEX:.*]] = arith.constant 4 : index
68aec735cfSagozillon!CHECK:  %[[COORD:.*]] = fir.coordinate_of %[[CONV]], %[[INDEX]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
69aec735cfSagozillon!CHECK:  %[[CONV:.*]] = fir.convert %[[COORD]] : (!fir.ref<i8>) -> !fir.ref<i32>
70aec735cfSagozillon!CHECK:  %[[MEMBER_TWO:.*]]:2 = hlfir.declare %[[CONV]] {uniq_name = "_QFElink2"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
71aec735cfSagozillonprogram main
72aec735cfSagozillon    implicit none
73aec735cfSagozillon    common /var_common_link/ link1, link2
74aec735cfSagozillon    integer :: link1, link2
75aec735cfSagozillon    !$omp declare target link(/var_common_link/)
76aec735cfSagozillon
77aec735cfSagozillon!$omp target map(tofrom: /var_common_link/)
78aec735cfSagozillon    link1 = link2 + 20
79aec735cfSagozillon!$omp end target
80aec735cfSagozillonend program
81