[flang-commits] [flang] [flang][OpenMP] Fix threadprivate pointer variable in common block (PR #131888)

Tom Eccles via flang-commits flang-commits at lists.llvm.org
Tue Mar 18 12:05:19 PDT 2025


https://github.com/tblah created https://github.com/llvm/llvm-project/pull/131888

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.

>From 0270a5a1c89f168413803934e5f3fe03d46e1dfc Mon Sep 17 00:00:00 2001
From: Tom Eccles <tom.eccles at arm.com>
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<!fir.array<28xi8>>
+! CHECK:           omp.parallel {
+! CHECK:             %[[VAL_17:.*]] = omp.threadprivate %[[VAL_0]] : !fir.ref<!fir.array<28xi8>> -> !fir.ref<!fir.array<28xi8>>
+! CHECK:             %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (!fir.ref<!fir.array<28xi8>>) -> !fir.ref<!fir.array<?xi8>>
+! CHECK:             %[[VAL_19:.*]] = arith.constant 0 : index
+! CHECK:             %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_18]], %[[VAL_19]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
+! CHECK:             %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (!fir.ref<i8>) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
+! CHECK:             %[[VAL_22:.*]]:2 = hlfir.declare %[[VAL_21]] {fortran_attrs = #{{.*}}<pointer>, uniq_name = "_QMmmmEnam1"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) -> (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
+



More information about the flang-commits mailing list