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