From e1aa8ad6faa1524f12338ca58d1eadfde6f29f34 Mon Sep 17 00:00:00 2001 From: Kareem Ergawy Date: Wed, 29 May 2024 11:58:59 +0200 Subject: [flang][OpenMP] Fix bug in emitting `dealloc` logic (#93641) Fixes a bug in emiting deacllocation logic when delayed privatization is disabled. I introduced the bug when implementing delayed privatization for allocatables: when delayed privatization is disabled the deacllocation ops are emitted for only one allocatable variables. --- flang/lib/Lower/OpenMP/DataSharingProcessor.cpp | 2 +- .../Lower/OpenMP/allocatable-multiple-vars.f90 | 28 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 flang/test/Lower/OpenMP/allocatable-multiple-vars.f90 diff --git a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp index b722e19..557a968 100644 --- a/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp +++ b/flang/lib/Lower/OpenMP/DataSharingProcessor.cpp @@ -86,7 +86,7 @@ void DataSharingProcessor::insertDeallocs() { if (semantics::IsAllocatable(sym->GetUltimate())) { if (!useDelayedPrivatization) { converter.createHostAssociateVarCloneDealloc(*sym); - return; + continue; } lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol(*sym); diff --git a/flang/test/Lower/OpenMP/allocatable-multiple-vars.f90 b/flang/test/Lower/OpenMP/allocatable-multiple-vars.f90 new file mode 100644 index 0000000..e6450a1 --- /dev/null +++ b/flang/test/Lower/OpenMP/allocatable-multiple-vars.f90 @@ -0,0 +1,28 @@ +! Test early privatization for multiple allocatable variables. + +! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization=false \ +! RUN: -o - %s 2>&1 | FileCheck %s + +! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization=false -o - %s 2>&1 |\ +! RUN: FileCheck %s + +subroutine delayed_privatization_allocatable + implicit none + integer, allocatable :: var1, var2 + +!$omp parallel private(var1, var2) + var1 = 10 + var2 = 20 +!$omp end parallel +end subroutine + +! Verify that private versions of each variable are both allocated and freed +! within the parallel region. + +! CHECK: omp.parallel { +! CHECK: fir.allocmem +! CHECK: fir.allocmem +! CHECK: fir.freemem +! CHECK: fir.freemem +! CHECK: omp.terminator +! CHECK-NEXT: } -- cgit v1.1