Skip to content

Commit 57d0d3b

Browse files
[Flang][OpenMP] Handle more character allocatable cases in privatization (#90449)
Fixes #84732, #81947, #81946 Note: This is a fix till we enable delayed privatization.
1 parent 088aa81 commit 57d0d3b

File tree

4 files changed

+128
-21
lines changed

4 files changed

+128
-21
lines changed

flang/lib/Lower/Bridge.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -675,25 +675,28 @@ class FirConverter : public Fortran::lower::AbstractConverter {
675675
auto if_builder = builder->genIfThenElse(loc, isAllocated);
676676
if_builder.genThen([&]() {
677677
std::string name = mangleName(sym) + ".alloc";
678-
if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(symType)) {
679-
fir::ExtendedValue read = fir::factory::genMutableBoxRead(
680-
*builder, loc, box, /*mayBePolymorphic=*/false);
681-
if (auto read_arr_box = read.getBoxOf<fir::ArrayBoxValue>()) {
682-
fir::factory::genInlinedAllocation(
683-
*builder, loc, *new_box, read_arr_box->getLBounds(),
684-
read_arr_box->getExtents(),
685-
/*lenParams=*/std::nullopt, name,
686-
/*mustBeHeap=*/true);
687-
} else if (auto read_char_arr_box =
688-
read.getBoxOf<fir::CharArrayBoxValue>()) {
689-
fir::factory::genInlinedAllocation(
690-
*builder, loc, *new_box, read_char_arr_box->getLBounds(),
691-
read_char_arr_box->getExtents(),
692-
read_char_arr_box->getLen(), name,
693-
/*mustBeHeap=*/true);
694-
} else {
695-
TODO(loc, "Unhandled allocatable box type");
696-
}
678+
fir::ExtendedValue read = fir::factory::genMutableBoxRead(
679+
*builder, loc, box, /*mayBePolymorphic=*/false);
680+
if (auto read_arr_box = read.getBoxOf<fir::ArrayBoxValue>()) {
681+
fir::factory::genInlinedAllocation(
682+
*builder, loc, *new_box, read_arr_box->getLBounds(),
683+
read_arr_box->getExtents(),
684+
/*lenParams=*/std::nullopt, name,
685+
/*mustBeHeap=*/true);
686+
} else if (auto read_char_arr_box =
687+
read.getBoxOf<fir::CharArrayBoxValue>()) {
688+
fir::factory::genInlinedAllocation(
689+
*builder, loc, *new_box, read_char_arr_box->getLBounds(),
690+
read_char_arr_box->getExtents(), read_char_arr_box->getLen(),
691+
name,
692+
/*mustBeHeap=*/true);
693+
} else if (auto read_char_box =
694+
read.getBoxOf<fir::CharBoxValue>()) {
695+
fir::factory::genInlinedAllocation(*builder, loc, *new_box,
696+
/*lbounds=*/std::nullopt,
697+
/*extents=*/std::nullopt,
698+
read_char_box->getLen(), name,
699+
/*mustBeHeap=*/true);
697700
} else {
698701
fir::factory::genInlinedAllocation(
699702
*builder, loc, *new_box, box.getMutableProperties().lbounds,

flang/test/Lower/OpenMP/cfg-conversion-omp.private.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ subroutine delayed_privatization_allocatable
3434
! CFGConv-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
3535
! CFGConv-NEXT: cf.cond_br %[[ALLOC_COND]], ^[[ALLOC_MEM_BB:.*]], ^[[ZERO_MEM_BB:.*]]
3636
! CFGConv-NEXT: ^[[ALLOC_MEM_BB]]:
37-
! CFGConv-NEXT: fir.allocmem
37+
! CFGConv: fir.allocmem
3838
! CFGConv: cf.br ^[[DECL_BB:.*]]
3939
! CFGConv: ^[[ZERO_MEM_BB]]:
4040
! CFGConv-NEXT: fir.zero_bits

flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ subroutine delayed_privatization_allocatable
2828
! CHECK-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
2929

3030
! CHECK-NEXT: fir.if %[[ALLOC_COND]] {
31-
! CHECK-NEXT: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"}
31+
! CHECK: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"}
3232
! CHECK-NEXT: %[[PRIV_ALLOCMEM_BOX:.*]] = fir.embox %[[PRIV_ALLOCMEM]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
3333
! CHECK-NEXT: fir.store %[[PRIV_ALLOCMEM_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
3434
! CHECK-NEXT: } else {

flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,107 @@ subroutine multiple_private_fix2()
9393
!$omp end parallel
9494
x = 1
9595
end subroutine
96+
97+
98+
! CHECK-LABEL: func.func @_QPsub01(
99+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>> {fir.bindc_name = "aaa"}) {
100+
! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
101+
! CHECK: %[[VAL_2:.*]] = fir.box_elesize %[[VAL_1]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
102+
! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] typeparams %[[VAL_2]] {fortran_attrs = #{{.*}}<allocatable>, uniq_name = "_QFsub01Eaaa"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, index) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
103+
! CHECK: omp.parallel {
104+
! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {bindc_name = "aaa", pinned, uniq_name = "_QFsub01Eaaa"}
105+
! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
106+
! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_5]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
107+
! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.heap<!fir.char<1,?>>) -> i64
108+
! CHECK: %[[VAL_8:.*]] = arith.constant 0 : i64
109+
! CHECK: %[[VAL_9:.*]] = arith.cmpi ne, %[[VAL_7]], %[[VAL_8]] : i64
110+
! CHECK: fir.if %[[VAL_9]] {
111+
! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index
112+
! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_10]] : index
113+
! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_2]], %[[VAL_10]] : index
114+
! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub01Eaaa.alloc"}
115+
! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
116+
! CHECK: fir.store %[[VAL_14]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
117+
! CHECK: } else {
118+
! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>>
119+
! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index
120+
! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
121+
! CHECK: fir.store %[[VAL_17]] to %[[VAL_4]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
122+
! CHECK: }
123+
! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #{{.*}}<allocatable>, uniq_name = "_QFsub01Eaaa"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
124+
! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
125+
! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
126+
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap<!fir.char<1,?>>) -> i64
127+
! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64
128+
! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64
129+
! CHECK: fir.if %[[VAL_23]] {
130+
! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
131+
! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
132+
! CHECK: fir.freemem %[[VAL_25]] : !fir.heap<!fir.char<1,?>>
133+
! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>>
134+
! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index
135+
! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
136+
! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
137+
! CHECK: }
138+
! CHECK: omp.terminator
139+
! CHECK: }
140+
! CHECK: return
141+
! CHECK: }
142+
143+
subroutine sub01(aaa)
144+
character(*),allocatable :: aaa
145+
!$omp parallel private(aaa)
146+
!$omp end parallel
147+
end subroutine
148+
149+
! CHECK-LABEL: func.func @_QPsub02(
150+
! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>> {fir.bindc_name = "bbb"}) {
151+
! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #{{.*}}<allocatable>, uniq_name = "_QFsub02Ebbb"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
152+
! CHECK: omp.parallel {
153+
! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {bindc_name = "bbb", pinned, uniq_name = "_QFsub02Ebbb"}
154+
! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
155+
! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
156+
! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (!fir.heap<!fir.char<1,?>>) -> i64
157+
! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64
158+
! CHECK: %[[VAL_7:.*]] = arith.cmpi ne, %[[VAL_5]], %[[VAL_6]] : i64
159+
! CHECK: fir.if %[[VAL_7]] {
160+
! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
161+
! CHECK: %[[VAL_9:.*]] = fir.box_elesize %[[VAL_8]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> index
162+
! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index
163+
! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_9]], %[[VAL_10]] : index
164+
! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_9]], %[[VAL_10]] : index
165+
! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub02Ebbb.alloc"}
166+
! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
167+
! CHECK: fir.store %[[VAL_14]] to %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
168+
! CHECK: } else {
169+
! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>>
170+
! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index
171+
! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
172+
! CHECK: fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
173+
! CHECK: }
174+
! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_2]] {fortran_attrs = #{{.*}}<allocatable>, uniq_name = "_QFsub02Ebbb"} : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>, !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>)
175+
! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
176+
! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
177+
! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap<!fir.char<1,?>>) -> i64
178+
! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64
179+
! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64
180+
! CHECK: fir.if %[[VAL_23]] {
181+
! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
182+
! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box<!fir.heap<!fir.char<1,?>>>) -> !fir.heap<!fir.char<1,?>>
183+
! CHECK: fir.freemem %[[VAL_25]] : !fir.heap<!fir.char<1,?>>
184+
! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>>
185+
! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index
186+
! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>>
187+
! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>
188+
! CHECK: }
189+
! CHECK: omp.terminator
190+
! CHECK: }
191+
! CHECK: return
192+
! CHECK: }
193+
194+
subroutine sub02(bbb)
195+
character(:),allocatable :: bbb
196+
!$omp parallel private(bbb)
197+
!$omp end parallel
198+
end subroutine sub02
199+

0 commit comments

Comments
 (0)