xref: /llvm-project/flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90 (revision 2918a47f421b3d41eb54dbd8751c6e8df2adbe23)
1913a8244SKareem Ergawy! Tests delayed privatization for `targets ... private(..)` for allocatables.
2913a8244SKareem Ergawy
31539da46SKareem Ergawy! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization-staging \
4913a8244SKareem Ergawy! RUN:   -o - %s 2>&1 | FileCheck %s
51539da46SKareem Ergawy! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization-staging -o - %s 2>&1 \
6913a8244SKareem Ergawy! RUN:   | FileCheck %s
7913a8244SKareem Ergawy
8913a8244SKareem Ergawysubroutine target_allocatable(lb, ub, l)
9913a8244SKareem Ergawy  implicit none
10913a8244SKareem Ergawy  integer mapped_var
11913a8244SKareem Ergawy  integer, allocatable :: alloc_var
12913a8244SKareem Ergawy  real :: real_var
13913a8244SKareem Ergawy
14913a8244SKareem Ergawy  integer(8) :: lb, ub
15913a8244SKareem Ergawy  real, dimension(lb:ub) :: real_arr
16913a8244SKareem Ergawy
17913a8244SKareem Ergawy  complex :: comp_var
18913a8244SKareem Ergawy
19913a8244SKareem Ergawy  integer(8):: l
20913a8244SKareem Ergawy  character(len = l)  :: char_var
21913a8244SKareem Ergawy
22913a8244SKareem Ergawy  !$omp target private(alloc_var, real_var) private(lb, real_arr) &
23913a8244SKareem Ergawy  !$omp&  private(comp_var) private(char_var)
24913a8244SKareem Ergawy    mapped_var = 5
25913a8244SKareem Ergawy
26913a8244SKareem Ergawy    alloc_var = 10
27913a8244SKareem Ergawy    real_var = 3.14
28913a8244SKareem Ergawy
29913a8244SKareem Ergawy    real_arr(lb + 1) = 6.28
30913a8244SKareem Ergawy
31913a8244SKareem Ergawy    comp_var = comp_var * comp_var
32913a8244SKareem Ergawy
33913a8244SKareem Ergawy    char_var = "hello"
34913a8244SKareem Ergawy  !$omp end target
35913a8244SKareem Ergawyend subroutine target_allocatable
36913a8244SKareem Ergawy
37913a8244SKareem Ergawy! Test the privatizer for `character`
38913a8244SKareem Ergawy!
39913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
40913a8244SKareem Ergawy! CHECK-SAME:   @[[CHAR_PRIVATIZER_SYM:[^[:space:]]+char_var[^[:space:]]+]]
41913a8244SKareem Ergawy! CHECK-SAME:   : [[CHAR_TYPE:!fir.boxchar<1>]] alloc {
42913a8244SKareem Ergawy!
43913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[CHAR_TYPE]]):
44913a8244SKareem Ergawy! CHECK-NEXT:   %[[UNBOX:.*]]:2 = fir.unboxchar %[[PRIV_ARG]]
45913a8244SKareem Ergawy! CHECK:        %[[PRIV_ALLOC:.*]] = fir.alloca !fir.char<1,?>(%[[UNBOX]]#1 : index)
46913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]] typeparams %[[UNBOX]]#1
47913a8244SKareem Ergawy! CHECK-NEXT:   omp.yield(%[[PRIV_DECL]]#0 : [[CHAR_TYPE]])
48913a8244SKareem Ergawy! CHECK-NEXT: }
49913a8244SKareem Ergawy
50913a8244SKareem Ergawy! Test the privatizer for `complex`
51913a8244SKareem Ergawy!
52913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
53913a8244SKareem Ergawy! CHECK-SAME:   @[[COMP_PRIVATIZER_SYM:[^[:space:]]+comp_var[^[:space:]]+]]
54c4204c0bSjeanPerier! CHECK-SAME:   : [[COMP_TYPE:!fir.ref<complex<f32>>]] alloc {
55913a8244SKareem Ergawy!
56913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[COMP_TYPE]]):
57c4204c0bSjeanPerier! CHECK-NEXT:   %[[PRIV_ALLOC:.*]] = fir.alloca complex<f32>
58913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]]
59913a8244SKareem Ergawy! CHECK-NEXT:   omp.yield(%[[PRIV_DECL]]#0 : [[COMP_TYPE]])
60913a8244SKareem Ergawy! CHECK-NEXT: }
61913a8244SKareem Ergawy
62913a8244SKareem Ergawy! Test the privatizer for `real(:)`
63913a8244SKareem Ergawy!
64913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
65913a8244SKareem Ergawy! CHECK-SAME:   @[[ARR_PRIVATIZER_SYM:[^[:space:]]+real_arr[^[:space:]]+]]
66913a8244SKareem Ergawy! CHECK-SAME:   : [[ARR_TYPE:!fir.box<!fir.array<\?xf32>>]] alloc {
67913a8244SKareem Ergawy!
68913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ARR_TYPE]]):
69913a8244SKareem Ergawy! CHECK:        %[[C0:.*]] = arith.constant 0 : index
70913a8244SKareem Ergawy! CHECK-NEXT:   %[[DIMS:.*]]:3 = fir.box_dims %[[PRIV_ARG]], %[[C0]] : ([[ARR_TYPE]], index)
71913a8244SKareem Ergawy! CHECK:        %[[PRIV_ALLOCA:.*]] = fir.alloca !fir.array<{{\?}}xf32>
72913a8244SKareem Ergawy! CHECK-NEXT:   %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1
73913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]](%[[SHAPE_SHIFT]])
74913a8244SKareem Ergawy! CHECK-NEXT:  omp.yield(%[[PRIV_DECL]]#0 : [[ARR_TYPE]])
75913a8244SKareem Ergawy! CHECK-NEXT: }
76913a8244SKareem Ergawy
77913a8244SKareem Ergawy! Test the privatizer for `real(:)`'s lower bound
78913a8244SKareem Ergawy!
79913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
80913a8244SKareem Ergawy! CHECK-SAME:   @[[LB_PRIVATIZER_SYM:[^[:space:]]+lb[^[:space:]]+]]
81913a8244SKareem Ergawy! CHECK-SAME:   : [[LB_TYPE:!fir.ref<i64>]] alloc {
82913a8244SKareem Ergawy
83913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[LB_TYPE]]):
84913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ALLOCA:.*]] = fir.alloca i64
85913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]]
86913a8244SKareem Ergawy! CHECK-NEXT:  omp.yield(%[[PRIV_DECL]]#0 : [[LB_TYPE]])
87913a8244SKareem Ergawy! CHECK-NEXT: }
88913a8244SKareem Ergawy
89913a8244SKareem Ergawy! Test the privatizer for `real`
90913a8244SKareem Ergawy!
91913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
92913a8244SKareem Ergawy! CHECK-SAME:   @[[REAL_PRIVATIZER_SYM:[^[:space:]]+real_var[^[:space:]]+]]
93913a8244SKareem Ergawy! CHECK-SAME:   : [[REAL_TYPE:!fir.ref<f32>]] alloc {
94913a8244SKareem Ergawy
95913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[REAL_TYPE]]):
96913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ALLOCA:.*]] = fir.alloca f32
97913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]]
98913a8244SKareem Ergawy! CHECK-NEXT:  omp.yield(%[[PRIV_DECL]]#0 : [[REAL_TYPE]])
99913a8244SKareem Ergawy! CHECK-NEXT: }
100913a8244SKareem Ergawy
101913a8244SKareem Ergawy! Test the privatizer for `allocatable`
102913a8244SKareem Ergawy!
103913a8244SKareem Ergawy! CHECK:      omp.private {type = private}
104913a8244SKareem Ergawy! CHECK-SAME:   @[[ALLOC_PRIVATIZER_SYM:[^[:space:]]+alloc_var[^[:space:]]+]]
105913a8244SKareem Ergawy! CHECK-SAME:   : [[ALLOC_TYPE:!fir.ref<!fir.box<!fir.heap<i32>>>]] alloc {
106913a8244SKareem Ergawy!
107913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ALLOC_TYPE]]):
108913a8244SKareem Ergawy! CHECK:        %[[PRIV_ALLOC:.*]] = fir.alloca !fir.box<!fir.heap<i32>>
109913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]] : !fir.ref<!fir.box<!fir.heap<i32>>>
110913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ARG_BOX:.*]] = fir.box_addr %[[PRIV_ARG_VAL]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
111913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ARG_ADDR:.*]] = fir.convert %[[PRIV_ARG_BOX]] : (!fir.heap<i32>) -> i64
112913a8244SKareem Ergawy! CHECK-NEXT:   %[[C0:.*]] = arith.constant 0 : i64
113913a8244SKareem Ergawy! CHECK-NEXT:   %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
114913a8244SKareem Ergawy!
115913a8244SKareem Ergawy! CHECK-NEXT:   fir.if %[[ALLOC_COND]] {
116913a8244SKareem Ergawy! CHECK:          %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, {{.*}}}
117913a8244SKareem Ergawy! CHECK-NEXT:     %[[PRIV_ALLOCMEM_BOX:.*]] = fir.embox %[[PRIV_ALLOCMEM]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
118913a8244SKareem Ergawy! CHECK-NEXT:     fir.store %[[PRIV_ALLOCMEM_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
119913a8244SKareem Ergawy! CHECK-NEXT:   } else {
120913a8244SKareem Ergawy! CHECK-NEXT:     %[[ZERO_BITS:.*]] = fir.zero_bits !fir.heap<i32>
121913a8244SKareem Ergawy! CHECK-NEXT:     %[[ZERO_BOX:.*]] = fir.embox %[[ZERO_BITS]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
122913a8244SKareem Ergawy! CHECK-NEXT:     fir.store %[[ZERO_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
123913a8244SKareem Ergawy! CHECK-NEXT:   }
124913a8244SKareem Ergawy!
125913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]]
126913a8244SKareem Ergawy! CHECK-NEXT:   omp.yield(%[[PRIV_DECL]]#0 : [[ALLOC_TYPE]])
127913a8244SKareem Ergawy!
128913a8244SKareem Ergawy! CHECK-NEXT: } dealloc {
129913a8244SKareem Ergawy! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ALLOC_TYPE]]):
130913a8244SKareem Ergawy!
131913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_VAL:.*]] = fir.load %[[PRIV_ARG]]
132913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ADDR:.*]] = fir.box_addr %[[PRIV_VAL]]
133913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_ADDR_I64:.*]] = fir.convert %[[PRIV_ADDR]]
134913a8244SKareem Ergawy! CHECK-NEXT:   %[[C0:.*]] = arith.constant 0 : i64
135913a8244SKareem Ergawy! CHECK-NEXT:   %[[PRIV_NULL_COND:.*]] = arith.cmpi ne, %[[PRIV_ADDR_I64]], %[[C0]] : i64
136913a8244SKareem Ergawy!
137913a8244SKareem Ergawy! CHECK-NEXT:   fir.if %[[PRIV_NULL_COND]] {
138913a8244SKareem Ergawy! CHECK:          %[[PRIV_VAL_2:.*]] = fir.load %[[PRIV_ARG]]
139913a8244SKareem Ergawy! CHECK-NEXT:     %[[PRIV_ADDR_2:.*]] = fir.box_addr %[[PRIV_VAL_2]]
140913a8244SKareem Ergawy! CHECK-NEXT:     fir.freemem %[[PRIV_ADDR_2]]
141913a8244SKareem Ergawy! CHECK-NEXT:     %[[ZEROS:.*]] = fir.zero_bits
142913a8244SKareem Ergawy! CHECK-NEXT:     %[[ZEROS_BOX:.*]]  = fir.embox %[[ZEROS]]
143913a8244SKareem Ergawy! CHECK-NEXT:     fir.store %[[ZEROS_BOX]] to %[[PRIV_ARG]]
144913a8244SKareem Ergawy! CHECK-NEXT:   }
145913a8244SKareem Ergawy!
146913a8244SKareem Ergawy! CHECK-NEXT:   omp.yield
147913a8244SKareem Ergawy! CHECK-NEXT: }
148913a8244SKareem Ergawy
149913a8244SKareem Ergawy! CHECK:      func.func @_QPtarget_allocatable
15011dad2faSPranav Bhandarkar! CHECK:        %[[CHAR_VAR_DESC_ALLOCA:.*]] = fir.alloca !fir.boxchar<1>
15111dad2faSPranav Bhandarkar! CHECK:        %[[REAL_ARR_DESC_ALLOCA:.*]] = fir.alloca !fir.box<!fir.array<?xf32>>
15211dad2faSPranav Bhandarkar! CHECK:        %[[ALLOC_VAR_ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "alloc_var", {{.*}}}
15311dad2faSPranav Bhandarkar! CHECK:        %[[ALLOC_VAR_DECL:.*]]:2 = hlfir.declare %[[ALLOC_VAR_ALLOCA]]
154913a8244SKareem Ergawy! CHECK:        %[[MAPPED_ALLOC:.*]] = fir.alloca i32 {bindc_name = "mapped_var", {{.*}}}
155913a8244SKareem Ergawy! CHECK-NEXT:   %[[MAPPED_DECL:.*]]:2 = hlfir.declare %[[MAPPED_ALLOC]]
15611dad2faSPranav Bhandarkar! CHECK:        %[[CHAR_VAR_ALLOC:.*]] = fir.alloca !fir.char<1,?>{{.*}} {bindc_name = "char_var", {{.*}}}
15711dad2faSPranav Bhandarkar! CHECK:        %[[CHAR_VAR_DECL:.*]]:2 = hlfir.declare %[[CHAR_VAR_ALLOC]] typeparams
15811dad2faSPranav Bhandarkar! CHECK:        %[[REAL_ARR_ALLOC:.*]] = fir.alloca !fir.array<?xf32>, {{.*}} {bindc_name = "real_arr", {{.*}}}
15911dad2faSPranav Bhandarkar! CHECK:        %[[REAL_ARR_DECL:.*]]:2 = hlfir.declare %[[REAL_ARR_ALLOC]]({{.*}})
16011dad2faSPranav Bhandarkar! CHECK:        %[[MAPPED_MI0:.*]] = omp.map.info var_ptr(%[[MAPPED_DECL]]#1 : !fir.ref<i32>, i32) {{.*}}
16111dad2faSPranav Bhandarkar! CHECK:        %[[ALLOC_VAR_MAP:.*]] = omp.map.info var_ptr(%[[ALLOC_VAR_DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>)
16211dad2faSPranav Bhandarkar! CHECK:        fir.store %[[REAL_ARR_DECL]]#0 to %[[REAL_ARR_DESC_ALLOCA]] : !fir.ref<!fir.box<!fir.array<?xf32>>>
16311dad2faSPranav Bhandarkar! CHECK:        %[[REAL_ARR_DESC_MAP:.*]] = omp.map.info var_ptr(%[[REAL_ARR_DESC_ALLOCA]] : !fir.ref<!fir.box<!fir.array<?xf32>>>, !fir.box<!fir.array<?xf32>>)
16411dad2faSPranav Bhandarkar! CHECK:        fir.store %[[CHAR_VAR_DECL]]#0 to %[[CHAR_VAR_DESC_ALLOCA]] : !fir.ref<!fir.boxchar<1>>
16511dad2faSPranav Bhandarkar! CHECK:        %[[CHAR_VAR_DESC_MAP:.*]] = omp.map.info var_ptr(%[[CHAR_VAR_DESC_ALLOCA]] : !fir.ref<!fir.boxchar<1>>, !fir.boxchar<1>)
166913a8244SKareem Ergawy! CHECK:        omp.target
16711dad2faSPranav Bhandarkar! CHECK-SAME:     map_entries(
16811dad2faSPranav Bhandarkar! CHECK-SAME:       %[[MAPPED_MI0]] -> %[[MAPPED_ARG0:[^,]+]],
16911dad2faSPranav Bhandarkar! CHECK-SAME:       %[[ALLOC_VAR_MAP]] -> %[[MAPPED_ARG1:[^,]+]]
17011dad2faSPranav Bhandarkar! CHECK-SAME        %[[REAL_ARR_DESC_MAP]] -> %[[MAPPED_ARG2:[^,]+]]
17111dad2faSPranav Bhandarkar! CHECK_SAME        %[[CHAR_VAR_DESC_MAP]] -> %[[MAPPED_ARG3:.[^,]+]] :
17211dad2faSPranav Bhandarkar! CHECK-SAME        !fir.ref<i32>, !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.array<?xf32>>>, !fir.ref<!fir.boxchar<1>>)
173913a8244SKareem Ergawy! CHECK-SAME:     private(
174*2918a47fSKareem Ergawy! CHECK-SAME:       @[[ALLOC_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[ALLOC_ARG:[^,]+]] [map_idx=1],
175cdb3ebf1SSergio Afonso! CHECK-SAME:       @[[REAL_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[REAL_ARG:[^,]+]],
176cdb3ebf1SSergio Afonso! CHECK-SAME:       @[[LB_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[LB_ARG:[^,]+]],
177*2918a47fSKareem Ergawy! CHECK-SAME:       @[[ARR_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[ARR_ARG:[^,]+]] [map_idx=2],
178cdb3ebf1SSergio Afonso! CHECK-SAME:       @[[COMP_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[COMP_ARG:[^,]+]],
179*2918a47fSKareem Ergawy! CHECK-SAME:       @[[CHAR_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[CHAR_ARG:[^,]+]] [map_idx=3] :
180c4204c0bSjeanPerier! CHECK-SAME:       !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<f32>, !fir.ref<i64>, !fir.box<!fir.array<?xf32>>, !fir.ref<complex<f32>>, !fir.boxchar<1>) {
181913a8244SKareem Ergawy! CHECK-NOT:      fir.alloca
182913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[ALLOC_ARG]]
183913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[REAL_ARG]]
184913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[LB_ARG]]
185913a8244SKareem Ergawy! CHECK:          %[[ARR_ARG_ADDR:.*]] = fir.box_addr %[[ARR_ARG]]
186913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[ARR_ARG_ADDR]]
187913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[COMP_ARG]]
188913a8244SKareem Ergawy! CHECK:          %[[CHAR_ARG_UNBOX:.*]]:2 = fir.unboxchar %[[CHAR_ARG]]
189913a8244SKareem Ergawy! CHECK:          hlfir.declare %[[CHAR_ARG_UNBOX]]
190913a8244SKareem Ergawy! CHECK:          omp.terminator
191913a8244SKareem Ergawy! CHECK-NEXT:   }
192913a8244SKareem Ergawy
193