1! This test checks lowering of OpenMP Threadprivate Directive.
2! Test for variables with different kind.
3
4!REQUIRES: shell
5!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s
6
7program test
8  integer, save :: i
9  integer(kind=1), save :: i1
10  integer(kind=2), save :: i2
11  integer(kind=4), save :: i4
12  integer(kind=8), save :: i8
13  integer(kind=16), save :: i16
14
15!CHECK-DAG:  [[ADDR0:%.*]] = fir.address_of(@_QFEi) : !fir.ref<i32>
16!CHECK-DAG:  [[NEWADDR0:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<i32> -> !fir.ref<i32>
17!CHECK-DAG:  [[ADDR1:%.*]] = fir.address_of(@_QFEi1) : !fir.ref<i8>
18!CHECK-DAG:  [[NEWADDR1:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<i8> -> !fir.ref<i8>
19!CHECK-DAG:  [[ADDR2:%.*]] = fir.address_of(@_QFEi16) : !fir.ref<i128>
20!CHECK-DAG:  [[NEWADDR2:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<i128> -> !fir.ref<i128>
21!CHECK-DAG:  [[ADDR3:%.*]] = fir.address_of(@_QFEi2) : !fir.ref<i16>
22!CHECK-DAG:  [[NEWADDR3:%.*]] = omp.threadprivate [[ADDR3]] : !fir.ref<i16> -> !fir.ref<i16>
23!CHECK-DAG:  [[ADDR4:%.*]] = fir.address_of(@_QFEi4) : !fir.ref<i32>
24!CHECK-DAG:  [[NEWADDR4:%.*]] = omp.threadprivate [[ADDR4]] : !fir.ref<i32> -> !fir.ref<i32>
25!CHECK-DAG:  [[ADDR5:%.*]] = fir.address_of(@_QFEi8) : !fir.ref<i64>
26!CHECK-DAG:  [[NEWADDR5:%.*]] = omp.threadprivate [[ADDR5]] : !fir.ref<i64> -> !fir.ref<i64>
27  !$omp threadprivate(i, i1, i2, i4, i8, i16)
28
29!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR0]] : !fir.ref<i32>
30!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR1]] : !fir.ref<i8>
31!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR2]] : !fir.ref<i128>
32!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR3]] : !fir.ref<i16>
33!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR4]] : !fir.ref<i32>
34!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR5]] : !fir.ref<i64>
35  print *, i, i1, i2, i4, i8, i16
36
37  !$omp parallel
38!CHECK-DAG:    [[ADDR39:%.*]] = omp.threadprivate [[ADDR0]] : !fir.ref<i32> -> !fir.ref<i32>
39!CHECK-DAG:    [[ADDR40:%.*]] = omp.threadprivate [[ADDR1]] : !fir.ref<i8> -> !fir.ref<i8>
40!CHECK-DAG:    [[ADDR41:%.*]] = omp.threadprivate [[ADDR2]] : !fir.ref<i128> -> !fir.ref<i128>
41!CHECK-DAG:    [[ADDR42:%.*]] = omp.threadprivate [[ADDR3]] : !fir.ref<i16> -> !fir.ref<i16>
42!CHECK-DAG:    [[ADDR43:%.*]] = omp.threadprivate [[ADDR4]] : !fir.ref<i32> -> !fir.ref<i32>
43!CHECK-DAG:    [[ADDR44:%.*]] = omp.threadprivate [[ADDR5]] : !fir.ref<i64> -> !fir.ref<i64>
44!CHECK-DAG:    %{{.*}} = fir.load [[ADDR39]] : !fir.ref<i32>
45!CHECK-DAG:    %{{.*}} = fir.load [[ADDR40]] : !fir.ref<i8>
46!CHECK-DAG:    %{{.*}} = fir.load [[ADDR41]] : !fir.ref<i128>
47!CHECK-DAG:    %{{.*}} = fir.load [[ADDR42]] : !fir.ref<i16>
48!CHECK-DAG:    %{{.*}} = fir.load [[ADDR43]] : !fir.ref<i32>
49!CHECK-DAG:    %{{.*}} = fir.load [[ADDR44]] : !fir.ref<i64>
50    print *, i, i1, i2, i4, i8, i16
51  !$omp end parallel
52
53!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR0]] : !fir.ref<i32>
54!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR1]] : !fir.ref<i8>
55!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR2]] : !fir.ref<i128>
56!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR3]] : !fir.ref<i16>
57!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR4]] : !fir.ref<i32>
58!CHECK-DAG:  %{{.*}} = fir.load [[NEWADDR5]] : !fir.ref<i64>
59  print *, i, i1, i2, i4, i8, i16
60
61!CHECK-DAG: fir.global internal @_QFEi : i32 {
62!CHECK-DAG: fir.global internal @_QFEi1 : i8 {
63!CHECK-DAG: fir.global internal @_QFEi16 : i128 {
64!CHECK-DAG: fir.global internal @_QFEi2 : i16 {
65!CHECK-DAG: fir.global internal @_QFEi4 : i32 {
66!CHECK-DAG: fir.global internal @_QFEi8 : i64 {
67end
68