1!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s --check-prefixes="FIRDialect,OMPDialect"
2!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | fir-opt --fir-to-llvm-ir | FileCheck %s --check-prefixes="LLVMDialect,OMPDialect"
3
4!FIRDialect-LABEL: func @_QPparallel_simple
5subroutine parallel_simple()
6   !OMPDialect: omp.parallel
7!$omp parallel
8   !FIRDialect: fir.call
9   call f1()
10!$omp end parallel
11end subroutine parallel_simple
12
13!===============================================================================
14! `if` clause
15!===============================================================================
16
17!FIRDialect-LABEL: func @_QPparallel_if
18subroutine parallel_if(alpha, beta, gamma)
19   integer, intent(in) :: alpha
20   logical, intent(in) :: beta
21   logical(1) :: logical1
22   logical(2) :: logical2
23   logical(4) :: logical4
24   logical(8) :: logical8
25
26   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
27   !$omp parallel if(alpha .le. 0)
28   !FIRDialect: fir.call
29   call f1()
30   !OMPDialect: omp.terminator
31   !$omp end parallel
32
33   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
34   !$omp parallel if(.false.)
35   !FIRDialect: fir.call
36   call f2()
37   !OMPDialect: omp.terminator
38   !$omp end parallel
39
40   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
41   !$omp parallel if(alpha .ge. 0)
42   !FIRDialect: fir.call
43   call f3()
44   !OMPDialect: omp.terminator
45   !$omp end parallel
46
47   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
48   !$omp parallel if(.true.)
49   !FIRDialect: fir.call
50   call f4()
51   !OMPDialect: omp.terminator
52   !$omp end parallel
53
54   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
55   !$omp parallel if(beta)
56   !FIRDialect: fir.call
57   call f1()
58   !OMPDialect: omp.terminator
59   !$omp end parallel
60
61   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
62   !$omp parallel if(logical1)
63   !FIRDialect: fir.call
64   call f1()
65   !OMPDialect: omp.terminator
66   !$omp end parallel
67
68   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
69   !$omp parallel if(logical2)
70   !FIRDialect: fir.call
71   call f1()
72   !OMPDialect: omp.terminator
73   !$omp end parallel
74
75   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
76   !$omp parallel if(logical4)
77   !FIRDialect: fir.call
78   call f1()
79   !OMPDialect: omp.terminator
80   !$omp end parallel
81
82   !OMPDialect: omp.parallel if(%{{.*}} : i1) {
83   !$omp parallel if(logical8)
84   !FIRDialect: fir.call
85   call f1()
86   !OMPDialect: omp.terminator
87   !$omp end parallel
88
89end subroutine parallel_if
90
91!===============================================================================
92! `num_threads` clause
93!===============================================================================
94
95!FIRDialect-LABEL: func @_QPparallel_numthreads
96subroutine parallel_numthreads(num_threads)
97   integer, intent(inout) :: num_threads
98
99   !OMPDialect: omp.parallel num_threads(%{{.*}}: i32) {
100   !$omp parallel num_threads(16)
101   !FIRDialect: fir.call
102   call f1()
103   !OMPDialect: omp.terminator
104   !$omp end parallel
105
106   num_threads = 4
107
108   !OMPDialect: omp.parallel num_threads(%{{.*}} : i32) {
109   !$omp parallel num_threads(num_threads)
110   !FIRDialect: fir.call
111   call f2()
112   !OMPDialect: omp.terminator
113   !$omp end parallel
114
115end subroutine parallel_numthreads
116
117!===============================================================================
118! `proc_bind` clause
119!===============================================================================
120
121!FIRDialect-LABEL: func @_QPparallel_proc_bind
122subroutine parallel_proc_bind()
123
124   !OMPDialect: omp.parallel proc_bind(master) {
125   !$omp parallel proc_bind(master)
126   !FIRDialect: fir.call
127   call f1()
128   !OMPDialect: omp.terminator
129   !$omp end parallel
130
131   !OMPDialect: omp.parallel proc_bind(close) {
132   !$omp parallel proc_bind(close)
133   !FIRDialect: fir.call
134   call f2()
135   !OMPDialect: omp.terminator
136   !$omp end parallel
137
138   !OMPDialect: omp.parallel proc_bind(spread) {
139   !$omp parallel proc_bind(spread)
140   !FIRDialect: fir.call
141   call f3()
142   !OMPDialect: omp.terminator
143   !$omp end parallel
144
145end subroutine parallel_proc_bind
146
147!===============================================================================
148! `allocate` clause
149!===============================================================================
150
151!FIRDialect-LABEL: func @_QPparallel_allocate
152subroutine parallel_allocate()
153   use omp_lib
154   integer :: x
155   !OMPDialect: omp.parallel allocate(
156   !FIRDialect: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
157   !LLVMDialect: %{{.+}} : i32 -> %{{.+}} : !llvm.ptr<i32>
158   !OMPDialect: ) {
159   !$omp parallel allocate(omp_high_bw_mem_alloc: x) private(x)
160   !FIRDialect: arith.addi
161   x = x + 12
162   !OMPDialect: omp.terminator
163   !$omp end parallel
164end subroutine parallel_allocate
165
166!===============================================================================
167! multiple clauses
168!===============================================================================
169
170!FIRDialect-LABEL: func @_QPparallel_multiple_clauses
171subroutine parallel_multiple_clauses(alpha, num_threads)
172   use omp_lib
173   integer, intent(inout) :: alpha
174   integer, intent(in) :: num_threads
175
176   !OMPDialect: omp.parallel if({{.*}} : i1) proc_bind(master) {
177   !$omp parallel if(alpha .le. 0) proc_bind(master)
178   !FIRDialect: fir.call
179   call f1()
180   !OMPDialect: omp.terminator
181   !$omp end parallel
182
183   !OMPDialect: omp.parallel num_threads({{.*}} : i32) proc_bind(close) {
184   !$omp parallel proc_bind(close) num_threads(num_threads)
185   !FIRDialect: fir.call
186   call f2()
187   !OMPDialect: omp.terminator
188   !$omp end parallel
189
190   !OMPDialect: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) {
191   !$omp parallel num_threads(num_threads) if(alpha .le. 0)
192   !FIRDialect: fir.call
193   call f3()
194   !OMPDialect: omp.terminator
195   !$omp end parallel
196
197   !OMPDialect: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) allocate(
198   !FIRDialect: %{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>
199   !LLVMDialect: %{{.+}} : i32 -> %{{.+}} : !llvm.ptr<i32>
200   !OMPDialect: ) {
201   !$omp parallel num_threads(num_threads) if(alpha .le. 0) allocate(omp_high_bw_mem_alloc: alpha) private(alpha)
202   !FIRDialect: fir.call
203   call f3()
204   !FIRDialect: arith.addi
205   alpha = alpha + 12
206   !OMPDialect: omp.terminator
207   !$omp end parallel
208
209end subroutine parallel_multiple_clauses
210