summaryrefslogtreecommitdiffstats
path: root/flang/test/Lower/OpenMP/threadprivate-host-association.f90
blob: 98f7b51bb9711582f42aba5c356306e443209947 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
! This test checks lowering of OpenMP Threadprivate Directive.
! Test for threadprivate variable in host association.

!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s

!CHECK: func.func @_QQmain() attributes {fir.bindc_name = "main"} {
!CHECK:   %[[A:.*]] = fir.address_of(@_QFEa) : !fir.ref<i32>
!CHECK:   %[[A_DECL:.*]]:2 = hlfir.declare %[[A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK:   %[[TP_A:.*]] = omp.threadprivate %[[A_DECL]]#1 : !fir.ref<i32> -> !fir.ref<i32>
!CHECK:   %[[TP_A_DECL:.*]]:2 = hlfir.declare %[[TP_A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK:   fir.call @_QFPsub() fastmath<contract> : () -> ()
!CHECK:   return
!CHECK: }
!CHECK: func.func private @_QFPsub() attributes {fir.internal_proc, llvm.linkage = #llvm.linkage<internal>} {
!CHECK:   %[[A:.*]] = fir.address_of(@_QFEa) : !fir.ref<i32>
!CHECK:   %[[A_DECL:.*]]:2 = hlfir.declare %[[A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK:   %[[TP_A:.*]] = omp.threadprivate %[[A_DECL]]#1 : !fir.ref<i32> -> !fir.ref<i32>
!CHECK:   %[[TP_A_DECL:.*]]:2 = hlfir.declare %[[TP_A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK:   omp.parallel {
!CHECK:     %[[PAR_TP_A:.*]] = omp.threadprivate %[[A_DECL]]#1 : !fir.ref<i32> -> !fir.ref<i32>
!CHECK:     %[[PAR_TP_A_DECL:.*]]:2 = hlfir.declare %[[PAR_TP_A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
!CHECK:     %{{.*}} = fir.load %[[PAR_TP_A_DECL]]#0 : !fir.ref<i32>
!CHECK:     omp.terminator
!CHECK:   }
!CHECK:   return
!CHECK: }
!CHECK: fir.global internal @_QFEa : i32 {
!CHECK:   %[[A:.*]] = fir.zero_bits i32
!CHECK:   fir.has_value %[[A]] : i32
!CHECK: }

program main
   integer, save :: a
   !$omp threadprivate(a)
   call sub()
contains
   subroutine sub()
      !$omp parallel
      print *, a
      !$omp end parallel
   end
end