1*411bd2d4SPeixin-Qiao! This test checks lowering of OpenMP Threadprivate Directive. 2*411bd2d4SPeixin-Qiao! Test for allocatable and pointer variables. 3*411bd2d4SPeixin-Qiao 4*411bd2d4SPeixin-Qiao!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s 5*411bd2d4SPeixin-Qiao 6*411bd2d4SPeixin-Qiaomodule test 7*411bd2d4SPeixin-Qiao integer, pointer :: x(:), m 8*411bd2d4SPeixin-Qiao real, allocatable :: y(:), n 9*411bd2d4SPeixin-Qiao 10*411bd2d4SPeixin-Qiao !$omp threadprivate(x, y, m, n) 11*411bd2d4SPeixin-Qiao 12*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEm : !fir.box<!fir.ptr<i32>> { 13*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEn : !fir.box<!fir.heap<f32>> { 14*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEx : !fir.box<!fir.ptr<!fir.array<?xi32>>> { 15*411bd2d4SPeixin-Qiao!CHECK-DAG: fir.global @_QMtestEy : !fir.box<!fir.heap<!fir.array<?xf32>>> { 16*411bd2d4SPeixin-Qiao 17*411bd2d4SPeixin-Qiaocontains 18*411bd2d4SPeixin-Qiao subroutine sub() 19*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR0:%.*]] = fir.address_of(@_QMtestEm) : !fir.ref<!fir.box<!fir.ptr<i32>>> 20*411bd2d4SPeixin-Qiao!CHECK-DAG: [[NEWADDR0:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<!fir.box<!fir.ptr<i32>>> -> !fir.ref<!fir.box<!fir.ptr<i32>>> 21*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR1:%.*]] = fir.address_of(@_QMtestEn) : !fir.ref<!fir.box<!fir.heap<f32>>> 22*411bd2d4SPeixin-Qiao!CHECK-DAG: [[NEWADDR1:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<!fir.box<!fir.heap<f32>>> -> !fir.ref<!fir.box<!fir.heap<f32>>> 23*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR2:%.*]] = fir.address_of(@_QMtestEx) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 24*411bd2d4SPeixin-Qiao!CHECK-DAG: [[NEWADDR2:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 25*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR3:%.*]] = fir.address_of(@_QMtestEy) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 26*411bd2d4SPeixin-Qiao!CHECK-DAG: [[NEWADDR3:%.*]] = omp.threadprivate [[ADDR3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 27*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR2]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 28*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 29*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR0]] : !fir.ref<!fir.box<!fir.ptr<i32>>> 30*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR1]] : !fir.ref<!fir.box<!fir.heap<f32>>> 31*411bd2d4SPeixin-Qiao print *, x, y, m, n 32*411bd2d4SPeixin-Qiao 33*411bd2d4SPeixin-Qiao !$omp parallel 34*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR54:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<!fir.box<!fir.ptr<i32>>> -> !fir.ref<!fir.box<!fir.ptr<i32>>> 35*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR55:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<!fir.box<!fir.heap<f32>>> -> !fir.ref<!fir.box<!fir.heap<f32>>> 36*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR56:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 37*411bd2d4SPeixin-Qiao!CHECK-DAG: [[ADDR57:%.*]] = omp.threadprivate [[ADDR3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 38*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[ADDR56]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 39*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[ADDR57]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 40*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[ADDR54]] : !fir.ref<!fir.box<!fir.ptr<i32>>> 41*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[ADDR55]] : !fir.ref<!fir.box<!fir.heap<f32>>> 42*411bd2d4SPeixin-Qiao print *, x, y, m, n 43*411bd2d4SPeixin-Qiao !$omp end parallel 44*411bd2d4SPeixin-Qiao 45*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR2]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> 46*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 47*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR0]] : !fir.ref<!fir.box<!fir.ptr<i32>>> 48*411bd2d4SPeixin-Qiao!CHECK-DAG: %{{.*}} = fir.load [[NEWADDR1]] : !fir.ref<!fir.box<!fir.heap<f32>>> 49*411bd2d4SPeixin-Qiao print *, x, y, m, n 50*411bd2d4SPeixin-Qiao end 51*411bd2d4SPeixin-Qiaoend 52