Skip to content

Commit 99aea21

Browse files
[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
1 parent b9a1e58 commit 99aea21

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

flang/lib/Semantics/resolve-directives.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2309,7 +2309,7 @@ void OmpAttributeVisitor::Post(const parser::Name &name) {
23092309
}
23102310

23112311
if (Symbol * found{currScope().FindSymbol(name.source)}) {
2312-
if (found->test(semantics::Symbol::Flag::OmpThreadprivate))
2312+
if (found->GetUltimate().test(semantics::Symbol::Flag::OmpThreadprivate))
23132313
return;
23142314
}
23152315

flang/test/Lower/OpenMP/threadprivate-hlfir.f90

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
!CHECK: %{{.*}} = fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[TP_VAL]]) fastmath<contract> : (!fir.ref<i8>, i32) -> i1
1616
!CHECK: omp.terminator
1717

18-
!CHECK: fir.global internal @_QFsubEa : i32
19-
2018
subroutine sub()
2119
integer, save:: a
2220
!$omp threadprivate(a)
@@ -25,3 +23,55 @@ subroutine sub()
2523
!$omp end parallel
2624
end subroutine
2725

26+
!CHECK-LABEL: func.func @_QPsub_02()
27+
subroutine sub_02()
28+
integer, save :: a
29+
!$omp threadprivate(a)
30+
!CHECK: %[[ADDR_02:.*]] = fir.address_of(@_QFsub_02Ea) : !fir.ref<i32>
31+
!CHECK: %[[DECL_02:.*]]:2 = hlfir.declare %[[ADDR_02]] {{{.*}} uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
32+
!CHECK: %[[TP_02:.*]] = omp.threadprivate %[[DECL_02]]#1 : !fir.ref<i32> -> !fir.ref<i32>
33+
!CHECK: %[[TP_DECL_02:.*]]:2 = hlfir.declare %[[TP_02]] {{{.*}} uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
34+
call sub_03
35+
!CHECK: fir.call @_QFsub_02Psub_03() fastmath<contract> : () -> ()
36+
!CHECK: return
37+
38+
contains
39+
40+
!CHECK-LABEL: func.func private @_QFsub_02Psub_03()
41+
subroutine sub_03()
42+
!CHECK: %[[ADDR_03:.*]] = fir.address_of(@_QFsub_02Ea) : !fir.ref<i32>
43+
!CHECK: %[[DECL_03:.*]]:2 = hlfir.declare %[[ADDR_03]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
44+
!CHECK: %[[TP_03:.*]] = omp.threadprivate %[[DECL_03]]#1 : !fir.ref<i32> -> !fir.ref<i32>
45+
!CHECK: %[[TP_DECL_03:.*]]:2 = hlfir.declare %[[TP_03]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
46+
!$omp parallel default(private)
47+
!CHECK: omp.parallel
48+
!CHECK: %[[TP_04:.*]] = omp.threadprivate %[[DECL_03]]#1 : !fir.ref<i32> -> !fir.ref<i32>
49+
!CHECK: %[[TP_DECL_04:.*]]:2 = hlfir.declare %[[TP_04]] {uniq_name = "_QFsub_02Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
50+
print *, a
51+
!CHECK: omp.terminator
52+
!$omp end parallel
53+
end subroutine
54+
end subroutine
55+
56+
module mod_01
57+
integer, save :: a
58+
!CHECK: fir.global @_QMmod_01Ea : i32
59+
!$omp threadprivate(a)
60+
end module
61+
62+
!CHECK-LABEL: func.func @_QPsub_05()
63+
subroutine sub_05()
64+
use mod_01, only: a
65+
!$omp parallel default(private)
66+
!CHECK: omp.parallel {
67+
!CHECK: %[[TP_05:.*]] = omp.threadprivate %{{.*}} : !fir.ref<i32> -> !fir.ref<i32>
68+
!CHECK: %{{.*}} = hlfir.declare %[[TP_05]] {uniq_name = "_QMmod_01Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
69+
print *, a
70+
!CHECK: omp.terminator
71+
!$omp end parallel
72+
end subroutine
73+
74+
75+
!CHECK: fir.global internal @_QFsubEa : i32
76+
77+
!CHECK: fir.global internal @_QFsub_02Ea : i32

0 commit comments

Comments
 (0)