xref: /llvm-project/flang/test/Lower/OpenMP/delayed-privatization-allocatable-array.f90 (revision 797f01198e8b41982916ba02d703bd6a96b5347e)
1! Test delayed privatization for allocatable arrays.
2
3! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization \
4! RUN:   -o - %s 2>&1 | FileCheck %s
5! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization -o - %s 2>&1 |\
6! RUN:   FileCheck %s
7
8subroutine delayed_privatization_private(var1, l1)
9  implicit none
10  integer(8):: l1
11  integer, allocatable, dimension(:) :: var1
12
13!$omp parallel firstprivate(var1)
14  var1(l1 + 1) = 10
15!$omp end parallel
16end subroutine
17
18! CHECK-LABEL: omp.private {type = firstprivate}
19! CHECK-SAME: @[[PRIVATIZER_SYM:.*]] : [[TYPE:!fir.ref<!fir.box<!fir.heap<!fir.array<\?xi32>>>>]] alloc {
20
21! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[TYPE]]):
22! CHECK-NEXT:   %[[PRIV_ALLOC:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<{{\?}}xi32>>> {bindc_name = "var1", pinned, uniq_name = "_QFdelayed_privatization_privateEvar1"}
23
24! CHECK-NEXT:   %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]]
25! CHECK-NEXT:   %[[PRIV_ARG_BOX:.*]] = fir.box_addr %[[PRIV_ARG_VAL]]
26! CHECK-NEXT:   %[[PRIV_ARG_ADDR:.*]] = fir.convert %[[PRIV_ARG_BOX]]
27! CHECK-NEXT:   %[[C0:.*]] = arith.constant 0 : i64
28! CHECK-NEXT:   %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
29
30! CHECK-NEXT:   fir.if %[[ALLOC_COND]] {
31! CHECK-NEXT:     %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]] : [[TYPE]]
32! CHECK-NEXT:     %[[C0:.*]] = arith.constant 0 : index
33! CHECK-NEXT:     %[[DIMS:.*]]:3 = fir.box_dims %[[PRIV_ARG_VAL]], %[[C0]]
34! CHECK-NEXT:     fir.box_addr %[[PRIV_ARG_VAL]]
35! CHECK-NEXT:     %[[C0_2:.*]] = arith.constant 0 : index
36! CHECK-NEXT:     %[[CMP:.*]] = arith.cmpi sgt, %[[DIMS]]#1, %[[C0_2]] : index
37! CHECK-NEXT:     %[[SELECT:.*]] = arith.select %[[CMP]], %[[DIMS]]#1, %[[C0_2]] : index
38! CHECK-NEXT:     %[[MEM:.*]] = fir.allocmem !fir.array<?xi32>, %[[SELECT]]
39! CHECK-NEXT:     %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[SELECT]] : (index, index) -> !fir.shapeshift<1>
40! CHECK-NEXT:     %[[EMBOX:.*]] = fir.embox %[[MEM]](%[[SHAPE_SHIFT]])
41! CHECK-NEXT:     fir.store %[[EMBOX]] to %[[PRIV_ALLOC]]
42! CHECK-NEXT:   } else {
43! CHECK-NEXT:     %[[ZEROS:.*]] = fir.zero_bits
44! CHECK-NEXT:     %[[C0_3:.*]] = arith.constant 0 : index
45! CHECK-NEXT:     %[[SHAPE:.*]] = fir.shape %[[C0_3]] : (index) -> !fir.shape<1>
46! CHECK-NEXT:     %[[EMBOX_2:.*]] = fir.embox %[[ZEROS]](%[[SHAPE]])
47! CHECK-NEXT:     fir.store %[[EMBOX_2]] to %[[PRIV_ALLOC]]
48! CHECK-NEXT:   }
49
50! CHECK-NEXT:   hlfir.declare
51! CHECK-NEXT:   omp.yield
52
53! CHECK-NEXT: } copy {
54! CHECK-NEXT: ^bb0(%[[PRIV_ORIG_ARG:.*]]: [[TYPE]], %[[PRIV_PRIV_ARG:.*]]: [[TYPE]]):
55! CHECK-NEXT:  %[[PRIV_BASE_VAL:.*]] = fir.load %[[PRIV_PRIV_ARG]]
56! CHECK-NEXT:  %[[PRIV_BASE_BOX:.*]] = fir.box_addr %[[PRIV_BASE_VAL]]
57! CHECK-NEXT:  %[[PRIV_BASE_ADDR:.*]] = fir.convert %[[PRIV_BASE_BOX]]
58! CHECK-NEXT:  %[[C0:.*]] = arith.constant 0 : i64
59! CHECK-NEXT:  %[[COPY_COND:.*]] = arith.cmpi ne, %[[PRIV_BASE_ADDR]], %[[C0]] : i64
60
61
62! CHECK-NEXT:  fir.if %[[COPY_COND]] {
63! CHECK-NEXT:    %[[PRIV_ORIG_ARG_VAL:.*]] = fir.load %[[PRIV_ORIG_ARG]]
64! CHECK-NEXT:    hlfir.assign %[[PRIV_ORIG_ARG_VAL]] to %[[PRIV_PRIV_ARG]] realloc
65! CHECK-NEXT:   }
66! CHECK-NEXT:   omp.yield
67! CHECK-NEXT: }
68