[flang-commits] [flang] [flang][OpenMP] Fix threadprivate pointer variable in common block (PR #131888)
via flang-commits
flang-commits at lists.llvm.org
Tue Mar 18 12:06:24 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Tom Eccles (tblah)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/131888.diff
2 Files Affected:
- (modified) flang/lib/Lower/OpenMP/OpenMP.cpp (+2-1)
- (added) flang/test/Lower/OpenMP/threadprivate-common-block-pointer.f90 (+31)
``````````diff
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>>>)
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/131888
More information about the flang-commits
mailing list