From 0270a5a1c89f168413803934e5f3fe03d46e1dfc Mon Sep 17 00:00:00 2001 From: Tom Eccles Date: Tue, 18 Mar 2025 18:58:09 +0000 Subject: [PATCH] [flang][OpenMP] Fix threadprivate pointer variable in common block Fixes #112538 The problem was that the host associated symbol for the threadprivate variable doesn't have all of the symbol attributes (e.g. POINTER). This caused the lowering code to generate the wrong type, eventually hitting an assertion. --- flang/lib/Lower/OpenMP/OpenMP.cpp | 3 +- .../threadprivate-common-block-pointer.f90 | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 05561af3fe62b..ac688a69d7fb6 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -763,7 +763,8 @@ static void threadPrivatizeVars(lower::AbstractConverter &converter, commonSyms.insert(common); } symThreadprivateValue = lower::genCommonBlockMember( - converter, currentLocation, *sym, commonThreadprivateValue); + converter, currentLocation, sym->GetUltimate(), + commonThreadprivateValue); } else { symThreadprivateValue = genThreadprivateOp(*sym); } diff --git a/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 b/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 new file mode 100644 index 0000000000000..730d810dc4f2e --- /dev/null +++ b/flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 @@ -0,0 +1,31 @@ +! Simple test for lowering of OpenMP Threadprivate Directive with a pointer var +! from a common block. + +!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s +!RUN: bbc -hlfir -emit-hlfir -fopenmp %s -o - | FileCheck %s + +! Regression test for a compiler crash + +module mmm +integer,pointer::nam1 +common /com1/nam1,nam2 +!$omp threadprivate(/com1/) +end +use mmm +!$omp parallel copyin(nam1) +!$omp end parallel +end + + +! CHECK-LABEL: fir.global common @com1_(dense<0> : vector<28xi8>) {alignment = 8 : i64} : !fir.array<28xi8> + +! CHECK-LABEL: func.func @_QQmain() { +! CHECK: %[[VAL_0:.*]] = fir.address_of(@com1_) : !fir.ref> +! CHECK: omp.parallel { +! CHECK: %[[VAL_17:.*]] = omp.threadprivate %[[VAL_0]] : !fir.ref> -> !fir.ref> +! CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (!fir.ref>) -> !fir.ref> +! CHECK: %[[VAL_19:.*]] = arith.constant 0 : index +! CHECK: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_18]], %[[VAL_19]] : (!fir.ref>, index) -> !fir.ref +! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref) -> !fir.ref>> +! CHECK: %[[VAL_22:.*]]:2 = hlfir.declare %[[VAL_21]] {fortran_attrs = #{{.*}}, uniq_name = "_QMmmmEnam1"} : (!fir.ref>>) -> (!fir.ref>>, !fir.ref>>) +