[flang-commits] [flang] 99aea21 - [Flang][OpenMP] Skip threadprivate HostAssoc symbols for default privatization (#127754)
via flang-commits
flang-commits at lists.llvm.org
Wed Feb 19 00:47:24 PST 2025
Author: Thirumalai Shaktivel
Date: 2025-02-19T14:17:20+05:30
New Revision: 99aea2176ba2327264501befbbd8dc6da4d64f94
URL: https://github.com/llvm/llvm-project/commit/99aea2176ba2327264501befbbd8dc6da4d64f94
DIFF: https://github.com/llvm/llvm-project/commit/99aea2176ba2327264501befbbd8dc6da4d64f94.diff
LOG: [Flang][OpenMP] Skip threadprivate HostAssoc symbols for default privatization (#127754)
Issue: Compilation abnormally terminates in parallel default(private)
Documentation reference:
A threadprivate variable must not appear as the base variable of a list
item in any clause except for the copyin and copyprivate clauses
Explanation:
>From the reference, the threadprivate symbols cannot be used in the DSA
clauses, which in turn means, the symbol can be skipped for default
privatization
Fixes #123535
Added:
Modified:
flang/lib/Semantics/resolve-directives.cpp
flang/test/Lower/OpenMP/threadprivate-hlfir.f90
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 91a1b3061e1f9..7a1dfe003e8c2 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2309,7 +2309,7 @@ void OmpAttributeVisitor::Post(const parser::Name &name) {
}
if (Symbol * found{currScope().FindSymbol(name.source)}) {
- if (found->test(semantics::Symbol::Flag::OmpThreadprivate))
+ if (found->GetUltimate().test(semantics::Symbol::Flag::OmpThreadprivate))
return;
}
diff --git a/flang/test/Lower/OpenMP/threadprivate-hlfir.f90 b/flang/test/Lower/OpenMP/threadprivate-hlfir.f90
index 7d02987c5eade..6201459bc42ca 100644
--- a/flang/test/Lower/OpenMP/threadprivate-hlfir.f90
+++ b/flang/test/Lower/OpenMP/threadprivate-hlfir.f90
@@ -15,8 +15,6 @@
!CHECK: %{{.*}} = fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[TP_VAL]]) fastmath<contract> : (!fir.ref<i8>, i32) -> i1
!CHECK: omp.terminator
-!CHECK: fir.global internal @_QFsubEa : i32
-
subroutine sub()
integer, save:: a
!$omp threadprivate(a)
@@ -25,3 +23,55 @@ subroutine sub()
!$omp end parallel
end subroutine
+!CHECK-LABEL: func.func @_QPsub_02()
+subroutine sub_02()
+ integer, save :: a
+ !$omp threadprivate(a)
+ !CHECK: %[[ADDR_02:.*]] = fir.address_of(@_QFsub_02Ea) : !fir.ref<i32>
+ !CHECK: %[[DECL_02:.*]]:2 = hlfir.declare %[[ADDR_02]] {{{.*}} uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ !CHECK: %[[TP_02:.*]] = omp.threadprivate %[[DECL_02]]#1 : !fir.ref<i32> -> !fir.ref<i32>
+ !CHECK: %[[TP_DECL_02:.*]]:2 = hlfir.declare %[[TP_02]] {{{.*}} uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ call sub_03
+ !CHECK: fir.call @_QFsub_02Psub_03() fastmath<contract> : () -> ()
+ !CHECK: return
+
+contains
+
+ !CHECK-LABEL: func.func private @_QFsub_02Psub_03()
+ subroutine sub_03()
+ !CHECK: %[[ADDR_03:.*]] = fir.address_of(@_QFsub_02Ea) : !fir.ref<i32>
+ !CHECK: %[[DECL_03:.*]]:2 = hlfir.declare %[[ADDR_03]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ !CHECK: %[[TP_03:.*]] = omp.threadprivate %[[DECL_03]]#1 : !fir.ref<i32> -> !fir.ref<i32>
+ !CHECK: %[[TP_DECL_03:.*]]:2 = hlfir.declare %[[TP_03]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ !$omp parallel default(private)
+ !CHECK: omp.parallel
+ !CHECK: %[[TP_04:.*]] = omp.threadprivate %[[DECL_03]]#1 : !fir.ref<i32> -> !fir.ref<i32>
+ !CHECK: %[[TP_DECL_04:.*]]:2 = hlfir.declare %[[TP_04]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ print *, a
+ !CHECK: omp.terminator
+ !$omp end parallel
+ end subroutine
+end subroutine
+
+module mod_01
+ integer, save :: a
+ !CHECK: fir.global @_QMmod_01Ea : i32
+ !$omp threadprivate(a)
+end module
+
+!CHECK-LABEL: func.func @_QPsub_05()
+subroutine sub_05()
+ use mod_01, only: a
+ !$omp parallel default(private)
+ !CHECK: omp.parallel {
+ !CHECK: %[[TP_05:.*]] = omp.threadprivate %{{.*}} : !fir.ref<i32> -> !fir.ref<i32>
+ !CHECK: %{{.*}} = hlfir.declare %[[TP_05]] {uniq_name = "_QMmod_01Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+ print *, a
+ !CHECK: omp.terminator
+ !$omp end parallel
+end subroutine
+
+
+!CHECK: fir.global internal @_QFsubEa : i32
+
+!CHECK: fir.global internal @_QFsub_02Ea : i32
More information about the flang-commits
mailing list