llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
25.95k stars 10.58k forks source link

[Flang][OpenMP] Handle more character allocatable cases in privatization #90449

Closed kiranchandramohan closed 2 weeks ago

kiranchandramohan commented 2 weeks ago

Fixes #84732, #81947, #81946

Note: This is a fix till we enable delayed privatization.

llvmbot commented 2 weeks ago

@llvm/pr-subscribers-flang-openmp

Author: Kiran Chandramohan (kiranchandramohan)

Changes Fixes #84732, #81947, #81946 Note: This is a fix till we enable delayed privatization. --- Full diff: https://github.com/llvm/llvm-project/pull/90449.diff 3 Files Affected: - (modified) flang/lib/Lower/Bridge.cpp (+21-19) - (modified) flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 (+1-1) - (modified) flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 (+104) ``````````diff diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index c05bf010b2bd5a..5467487cd440d9 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -683,25 +683,27 @@ class FirConverter : public Fortran::lower::AbstractConverter { auto if_builder = builder->genIfThenElse(loc, isAllocated); if_builder.genThen([&]() { std::string name = mangleName(sym) + ".alloc"; - if (auto seqTy = mlir::dyn_cast(symType)) { - fir::ExtendedValue read = fir::factory::genMutableBoxRead( - *builder, loc, box, /*mayBePolymorphic=*/false); - if (auto read_arr_box = read.getBoxOf()) { - fir::factory::genInlinedAllocation( - *builder, loc, *new_box, read_arr_box->getLBounds(), - read_arr_box->getExtents(), - /*lenParams=*/std::nullopt, name, - /*mustBeHeap=*/true); - } else if (auto read_char_arr_box = - read.getBoxOf()) { - fir::factory::genInlinedAllocation( - *builder, loc, *new_box, read_char_arr_box->getLBounds(), - read_char_arr_box->getExtents(), - read_char_arr_box->getLen(), name, - /*mustBeHeap=*/true); - } else { - TODO(loc, "Unhandled allocatable box type"); - } + fir::ExtendedValue read = fir::factory::genMutableBoxRead( + *builder, loc, box, /*mayBePolymorphic=*/false); + if (auto read_arr_box = read.getBoxOf()) { + fir::factory::genInlinedAllocation( + *builder, loc, *new_box, read_arr_box->getLBounds(), + read_arr_box->getExtents(), + /*lenParams=*/std::nullopt, name, + /*mustBeHeap=*/true); + } else if (auto read_char_arr_box = + read.getBoxOf()) { + fir::factory::genInlinedAllocation( + *builder, loc, *new_box, read_char_arr_box->getLBounds(), + read_char_arr_box->getExtents(), read_char_arr_box->getLen(), + name, + /*mustBeHeap=*/true); + } else if (auto read_char_box = + read.getBoxOf()) { + fir::factory::genInlinedAllocation(*builder, loc, *new_box, + std::nullopt, std::nullopt, + read_char_box->getLen(), name, + /*mustBeHeap=*/true); } else { fir::factory::genInlinedAllocation( *builder, loc, *new_box, box.getMutableProperties().lbounds, diff --git a/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 b/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 index cc1818b00b809c..c982e5f582cc59 100644 --- a/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 +++ b/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 @@ -28,7 +28,7 @@ subroutine delayed_privatization_allocatable ! CHECK-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64 ! CHECK-NEXT: fir.if %[[ALLOC_COND]] { -! CHECK-NEXT: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"} +! CHECK: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"} ! CHECK-NEXT: %[[PRIV_ALLOCMEM_BOX:.*]] = fir.embox %[[PRIV_ALLOCMEM]] : (!fir.heap) -> !fir.box> ! CHECK-NEXT: fir.store %[[PRIV_ALLOCMEM_BOX]] to %[[PRIV_ALLOC]] : !fir.ref>> ! CHECK-NEXT: } else { diff --git a/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 b/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 index 93809fde98a269..f8343338112c91 100644 --- a/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 +++ b/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 @@ -93,3 +93,107 @@ subroutine multiple_private_fix2() !$omp end parallel x = 1 end subroutine + + +! CHECK-LABEL: func.func @_QPsub01( +! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>>> {fir.bindc_name = "aaa"}) { +! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref>>> +! CHECK: %[[VAL_2:.*]] = fir.box_elesize %[[VAL_1]] : (!fir.box>>) -> index +! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] typeparams %[[VAL_2]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub01Eaaa"} : (!fir.ref>>>, index) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: omp.parallel { +! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.box>> {bindc_name = "aaa", pinned, uniq_name = "_QFsub01Eaaa"} +! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref>>> +! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_5]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_8:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_9:.*]] = arith.cmpi ne, %[[VAL_7]], %[[VAL_8]] : i64 +! CHECK: fir.if %[[VAL_9]] { +! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_10]] : index +! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_2]], %[[VAL_10]] : index +! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub01Eaaa.alloc"} +! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_14]] to %[[VAL_4]] : !fir.ref>>> +! CHECK: } else { +! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_17]] to %[[VAL_4]] : !fir.ref>>> +! CHECK: } +! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub01Eaaa"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64 +! CHECK: fir.if %[[VAL_23]] { +! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box>>) -> !fir.heap> +! CHECK: fir.freemem %[[VAL_25]] : !fir.heap> +! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: } +! CHECK: omp.terminator +! CHECK: } +! CHECK: return +! CHECK: } + +subroutine sub01(aaa) + character(*),allocatable :: aaa + !$omp parallel private(aaa) + !$omp end parallel +end subroutine + +! CHECK-LABEL: func.func @_QPsub02( +! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>>> {fir.bindc_name = "bbb"}) { +! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub02Ebbb"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: omp.parallel { +! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box>> {bindc_name = "bbb", pinned, uniq_name = "_QFsub02Ebbb"} +! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref>>> +! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_7:.*]] = arith.cmpi ne, %[[VAL_5]], %[[VAL_6]] : i64 +! CHECK: fir.if %[[VAL_7]] { +! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref>>> +! CHECK: %[[VAL_9:.*]] = fir.box_elesize %[[VAL_8]] : (!fir.box>>) -> index +! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_9]], %[[VAL_10]] : index +! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_9]], %[[VAL_10]] : index +! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub02Ebbb.alloc"} +! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_14]] to %[[VAL_2]] : !fir.ref>>> +! CHECK: } else { +! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref>>> +! CHECK: } +! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_2]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub02Ebbb"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64 +! CHECK: fir.if %[[VAL_23]] { +! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box>>) -> !fir.heap> +! CHECK: fir.freemem %[[VAL_25]] : !fir.heap> +! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: } +! CHECK: omp.terminator +! CHECK: } +! CHECK: return +! CHECK: } + +subroutine sub02(bbb) + character(:),allocatable :: bbb + !$omp parallel private(bbb) + !$omp end parallel +end subroutine sub02 + ``````````
llvmbot commented 2 weeks ago

@llvm/pr-subscribers-flang-fir-hlfir

Author: Kiran Chandramohan (kiranchandramohan)

Changes Fixes #84732, #81947, #81946 Note: This is a fix till we enable delayed privatization. --- Full diff: https://github.com/llvm/llvm-project/pull/90449.diff 3 Files Affected: - (modified) flang/lib/Lower/Bridge.cpp (+21-19) - (modified) flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 (+1-1) - (modified) flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 (+104) ``````````diff diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index c05bf010b2bd5a..5467487cd440d9 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -683,25 +683,27 @@ class FirConverter : public Fortran::lower::AbstractConverter { auto if_builder = builder->genIfThenElse(loc, isAllocated); if_builder.genThen([&]() { std::string name = mangleName(sym) + ".alloc"; - if (auto seqTy = mlir::dyn_cast(symType)) { - fir::ExtendedValue read = fir::factory::genMutableBoxRead( - *builder, loc, box, /*mayBePolymorphic=*/false); - if (auto read_arr_box = read.getBoxOf()) { - fir::factory::genInlinedAllocation( - *builder, loc, *new_box, read_arr_box->getLBounds(), - read_arr_box->getExtents(), - /*lenParams=*/std::nullopt, name, - /*mustBeHeap=*/true); - } else if (auto read_char_arr_box = - read.getBoxOf()) { - fir::factory::genInlinedAllocation( - *builder, loc, *new_box, read_char_arr_box->getLBounds(), - read_char_arr_box->getExtents(), - read_char_arr_box->getLen(), name, - /*mustBeHeap=*/true); - } else { - TODO(loc, "Unhandled allocatable box type"); - } + fir::ExtendedValue read = fir::factory::genMutableBoxRead( + *builder, loc, box, /*mayBePolymorphic=*/false); + if (auto read_arr_box = read.getBoxOf()) { + fir::factory::genInlinedAllocation( + *builder, loc, *new_box, read_arr_box->getLBounds(), + read_arr_box->getExtents(), + /*lenParams=*/std::nullopt, name, + /*mustBeHeap=*/true); + } else if (auto read_char_arr_box = + read.getBoxOf()) { + fir::factory::genInlinedAllocation( + *builder, loc, *new_box, read_char_arr_box->getLBounds(), + read_char_arr_box->getExtents(), read_char_arr_box->getLen(), + name, + /*mustBeHeap=*/true); + } else if (auto read_char_box = + read.getBoxOf()) { + fir::factory::genInlinedAllocation(*builder, loc, *new_box, + std::nullopt, std::nullopt, + read_char_box->getLen(), name, + /*mustBeHeap=*/true); } else { fir::factory::genInlinedAllocation( *builder, loc, *new_box, box.getMutableProperties().lbounds, diff --git a/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 b/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 index cc1818b00b809c..c982e5f582cc59 100644 --- a/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 +++ b/flang/test/Lower/OpenMP/delayed-privatization-allocatable-private.f90 @@ -28,7 +28,7 @@ subroutine delayed_privatization_allocatable ! CHECK-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64 ! CHECK-NEXT: fir.if %[[ALLOC_COND]] { -! CHECK-NEXT: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"} +! CHECK: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFdelayed_privatization_allocatableEvar1.alloc"} ! CHECK-NEXT: %[[PRIV_ALLOCMEM_BOX:.*]] = fir.embox %[[PRIV_ALLOCMEM]] : (!fir.heap) -> !fir.box> ! CHECK-NEXT: fir.store %[[PRIV_ALLOCMEM_BOX]] to %[[PRIV_ALLOC]] : !fir.ref>> ! CHECK-NEXT: } else { diff --git a/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 b/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 index 93809fde98a269..f8343338112c91 100644 --- a/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 +++ b/flang/test/Lower/OpenMP/parallel-private-clause-fixes.f90 @@ -93,3 +93,107 @@ subroutine multiple_private_fix2() !$omp end parallel x = 1 end subroutine + + +! CHECK-LABEL: func.func @_QPsub01( +! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>>> {fir.bindc_name = "aaa"}) { +! CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref>>> +! CHECK: %[[VAL_2:.*]] = fir.box_elesize %[[VAL_1]] : (!fir.box>>) -> index +! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] typeparams %[[VAL_2]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub01Eaaa"} : (!fir.ref>>>, index) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: omp.parallel { +! CHECK: %[[VAL_4:.*]] = fir.alloca !fir.box>> {bindc_name = "aaa", pinned, uniq_name = "_QFsub01Eaaa"} +! CHECK: %[[VAL_5:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref>>> +! CHECK: %[[VAL_6:.*]] = fir.box_addr %[[VAL_5]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_8:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_9:.*]] = arith.cmpi ne, %[[VAL_7]], %[[VAL_8]] : i64 +! CHECK: fir.if %[[VAL_9]] { +! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_2]], %[[VAL_10]] : index +! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_2]], %[[VAL_10]] : index +! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub01Eaaa.alloc"} +! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_14]] to %[[VAL_4]] : !fir.ref>>> +! CHECK: } else { +! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_17]] to %[[VAL_4]] : !fir.ref>>> +! CHECK: } +! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub01Eaaa"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64 +! CHECK: fir.if %[[VAL_23]] { +! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box>>) -> !fir.heap> +! CHECK: fir.freemem %[[VAL_25]] : !fir.heap> +! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: } +! CHECK: omp.terminator +! CHECK: } +! CHECK: return +! CHECK: } + +subroutine sub01(aaa) + character(*),allocatable :: aaa + !$omp parallel private(aaa) + !$omp end parallel +end subroutine + +! CHECK-LABEL: func.func @_QPsub02( +! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref>>> {fir.bindc_name = "bbb"}) { +! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub02Ebbb"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: omp.parallel { +! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.box>> {bindc_name = "bbb", pinned, uniq_name = "_QFsub02Ebbb"} +! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref>>> +! CHECK: %[[VAL_4:.*]] = fir.box_addr %[[VAL_3]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_6:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_7:.*]] = arith.cmpi ne, %[[VAL_5]], %[[VAL_6]] : i64 +! CHECK: fir.if %[[VAL_7]] { +! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref>>> +! CHECK: %[[VAL_9:.*]] = fir.box_elesize %[[VAL_8]] : (!fir.box>>) -> index +! CHECK: %[[VAL_10:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_9]], %[[VAL_10]] : index +! CHECK: %[[VAL_12:.*]] = arith.select %[[VAL_11]], %[[VAL_9]], %[[VAL_10]] : index +! CHECK: %[[VAL_13:.*]] = fir.allocmem !fir.char<1,?>(%[[VAL_12]] : index) {fir.must_be_heap = true, uniq_name = "_QFsub02Ebbb.alloc"} +! CHECK: %[[VAL_14:.*]] = fir.embox %[[VAL_13]] typeparams %[[VAL_12]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_14]] to %[[VAL_2]] : !fir.ref>>> +! CHECK: } else { +! CHECK: %[[VAL_15:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_16:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_17:.*]] = fir.embox %[[VAL_15]] typeparams %[[VAL_16]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref>>> +! CHECK: } +! CHECK: %[[VAL_18:.*]]:2 = hlfir.declare %[[VAL_2]] {fortran_attrs = #{{.*}}, uniq_name = "_QFsub02Ebbb"} : (!fir.ref>>>) -> (!fir.ref>>>, !fir.ref>>>) +! CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_20:.*]] = fir.box_addr %[[VAL_19]] : (!fir.box>>) -> !fir.heap> +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.heap>) -> i64 +! CHECK: %[[VAL_22:.*]] = arith.constant 0 : i64 +! CHECK: %[[VAL_23:.*]] = arith.cmpi ne, %[[VAL_21]], %[[VAL_22]] : i64 +! CHECK: fir.if %[[VAL_23]] { +! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: %[[VAL_25:.*]] = fir.box_addr %[[VAL_24]] : (!fir.box>>) -> !fir.heap> +! CHECK: fir.freemem %[[VAL_25]] : !fir.heap> +! CHECK: %[[VAL_26:.*]] = fir.zero_bits !fir.heap> +! CHECK: %[[VAL_27:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_28:.*]] = fir.embox %[[VAL_26]] typeparams %[[VAL_27]] : (!fir.heap>, index) -> !fir.box>> +! CHECK: fir.store %[[VAL_28]] to %[[VAL_18]]#0 : !fir.ref>>> +! CHECK: } +! CHECK: omp.terminator +! CHECK: } +! CHECK: return +! CHECK: } + +subroutine sub02(bbb) + character(:),allocatable :: bbb + !$omp parallel private(bbb) + !$omp end parallel +end subroutine sub02 + ``````````