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