43 lines · plain
1! This test checks lowering of OpenMP Threadprivate Directive.2! Test for threadprivate variable in host association.3 4!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s5 6!CHECK: func.func @_QQmain() attributes {fir.bindc_name = "MAIN"} {7!CHECK: %[[A:.*]] = fir.address_of(@_QFEa) : !fir.ref<i32>8!CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A]] {fortran_attrs = #fir.var_attrs<internal_assoc>, uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)9!CHECK: %[[TP_A:.*]] = omp.threadprivate %[[A_DECL]]#0 : !fir.ref<i32> -> !fir.ref<i32>10!CHECK: %[[TP_A_DECL:.*]]:2 = hlfir.declare %[[TP_A]] {fortran_attrs = #fir.var_attrs<internal_assoc>, uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)11!CHECK: fir.call @_QFPsub() fastmath<contract> : () -> ()12!CHECK: return13!CHECK: }14!CHECK: func.func private @_QFPsub() attributes {fir.host_symbol = {{.*}}, llvm.linkage = #llvm.linkage<internal>} {15!CHECK: %[[A:.*]] = fir.address_of(@_QFEa) : !fir.ref<i32>16!CHECK: %[[A_DECL:.*]]:2 = hlfir.declare %[[A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)17!CHECK: %[[TP_A:.*]] = omp.threadprivate %[[A_DECL]]#0 : !fir.ref<i32> -> !fir.ref<i32>18!CHECK: %[[TP_A_DECL:.*]]:2 = hlfir.declare %[[TP_A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)19!CHECK: omp.parallel {20!CHECK: %[[PAR_TP_A:.*]] = omp.threadprivate %[[A_DECL]]#0 : !fir.ref<i32> -> !fir.ref<i32>21!CHECK: %[[PAR_TP_A_DECL:.*]]:2 = hlfir.declare %[[PAR_TP_A]] {uniq_name = "_QFEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)22!CHECK: %{{.*}} = fir.load %[[PAR_TP_A_DECL]]#0 : !fir.ref<i32>23!CHECK: omp.terminator24!CHECK: }25!CHECK: return26!CHECK: }27!CHECK: fir.global internal @_QFEa : i32 {28!CHECK: %[[A:.*]] = fir.zero_bits i3229!CHECK: fir.has_value %[[A]] : i3230!CHECK: }31 32program main33 integer, save :: a34 !$omp threadprivate(a)35 call sub()36contains37 subroutine sub()38 !$omp parallel39 print *, a40 !$omp end parallel41 end42end43