xref: /llvm-project/flang/test/Lower/OpenMP/loop-compound.f90 (revision 2f245875b2f71272e6d7a78b4aed5be81109e9b9)
1! This test checks lowering of OpenMP compound (combined and composite) loop
2! constructs.
3
4! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s
5! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s
6
7program main
8  integer :: i,j
9
10  ! TODO When composite constructs are supported add:
11  ! - TASKLOOP SIMD
12
13  ! ----------------------------------------------------------------------------
14  ! DISTRIBUTE PARALLEL DO
15  ! ----------------------------------------------------------------------------
16  !$omp teams
17
18  ! CHECK: omp.parallel
19  ! CHECK: omp.distribute
20  ! CHECK-NEXT: omp.wsloop
21  ! CHECK-NEXT: omp.loop_nest
22  !$omp distribute parallel do
23  do i = 1, 10
24  end do
25  !$omp end distribute parallel do
26
27  !$omp end teams
28
29  ! ----------------------------------------------------------------------------
30  ! DISTRIBUTE PARALLEL DO SIMD
31  ! ----------------------------------------------------------------------------
32  !$omp teams
33
34  ! CHECK: omp.parallel
35  ! CHECK: omp.distribute
36  ! CHECK-NEXT: omp.wsloop
37  ! CHECK-NEXT: omp.simd
38  ! CHECK-NEXT: omp.loop_nest
39  !$omp distribute parallel do simd
40  do i = 1, 10
41  end do
42  !$omp end distribute parallel do simd
43
44  !$omp end teams
45
46  ! ----------------------------------------------------------------------------
47  ! DISTRIBUTE SIMD
48  ! ----------------------------------------------------------------------------
49  !$omp teams
50
51  ! CHECK: omp.distribute
52  ! CHECK-NEXT: omp.simd
53  ! CHECK-NEXT: omp.loop_nest
54  !$omp distribute simd
55  do i = 1, 10
56  end do
57  !$omp end distribute simd
58
59  !$omp end teams
60
61  ! ----------------------------------------------------------------------------
62  ! DO SIMD
63  ! ----------------------------------------------------------------------------
64  ! CHECK: omp.wsloop
65  ! CHECK-NEXT: omp.simd
66  ! CHECK-NEXT: omp.loop_nest
67  !$omp do simd
68  do i = 1, 10
69  end do
70  !$omp end do simd
71
72  ! ----------------------------------------------------------------------------
73  ! PARALLEL DO SIMD
74  ! ----------------------------------------------------------------------------
75  ! CHECK: omp.parallel
76  ! CHECK: omp.wsloop
77  ! CHECK-NEXT: omp.simd
78  ! CHECK-NEXT: omp.loop_nest
79  !$omp parallel do simd
80  do i = 1, 10
81  end do
82  !$omp end parallel do simd
83
84  ! ----------------------------------------------------------------------------
85  ! PARALLEL DO
86  ! ----------------------------------------------------------------------------
87  ! CHECK: omp.parallel
88  ! CHECK: omp.wsloop
89  ! CHECK-NEXT: omp.loop_nest
90  !$omp parallel do
91  do i = 1, 10
92  end do
93  !$omp end parallel do
94
95  ! ----------------------------------------------------------------------------
96  ! TARGET PARALLEL DO SIMD
97  ! ----------------------------------------------------------------------------
98  ! CHECK: omp.target
99  ! CHECK: omp.parallel
100  ! CHECK: omp.wsloop
101  ! CHECK-NEXT: omp.simd
102  ! CHECK-NEXT: omp.loop_nest
103  !$omp target parallel do simd
104  do i = 1, 10
105  end do
106  !$omp end target parallel do simd
107
108  ! ----------------------------------------------------------------------------
109  ! TARGET PARALLEL DO
110  ! ----------------------------------------------------------------------------
111  ! CHECK: omp.target
112  ! CHECK: omp.parallel
113  ! CHECK: omp.wsloop
114  ! CHECK-NEXT: omp.loop_nest
115  !$omp target parallel do
116  do i = 1, 10
117  end do
118  !$omp end target parallel do
119
120  ! ----------------------------------------------------------------------------
121  ! TARGET SIMD
122  ! ----------------------------------------------------------------------------
123  ! CHECK: omp.target
124  ! CHECK: omp.simd
125  ! CHECK-NEXT: omp.loop_nest
126  !$omp target simd
127  do i = 1, 10
128  end do
129  !$omp end target simd
130
131  ! ----------------------------------------------------------------------------
132  ! TARGET TEAMS DISTRIBUTE
133  ! ----------------------------------------------------------------------------
134  ! CHECK: omp.target
135  ! CHECK: omp.teams
136  ! CHECK: omp.distribute
137  ! CHECK-NEXT: omp.loop_nest
138  !$omp target teams distribute
139  do i = 1, 10
140  end do
141  !$omp end target teams distribute
142
143  ! ----------------------------------------------------------------------------
144  ! TARGET TEAMS DISTRIBUTE PARALLEL DO
145  ! ----------------------------------------------------------------------------
146  ! CHECK: omp.target
147  ! CHECK: omp.teams
148  ! CHECK: omp.parallel
149  ! CHECK: omp.distribute
150  ! CHECK-NEXT: omp.wsloop
151  ! CHECK-NEXT: omp.loop_nest
152  !$omp target teams distribute parallel do
153  do i = 1, 10
154  end do
155  !$omp end target teams distribute parallel do
156
157  ! ----------------------------------------------------------------------------
158  ! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD
159  ! ----------------------------------------------------------------------------
160  ! CHECK: omp.target
161  ! CHECK: omp.teams
162  ! CHECK: omp.parallel
163  ! CHECK: omp.distribute
164  ! CHECK-NEXT: omp.wsloop
165  ! CHECK-NEXT: omp.simd
166  ! CHECK-NEXT: omp.loop_nest
167  !$omp target teams distribute parallel do simd
168  do i = 1, 10
169  end do
170  !$omp end target teams distribute parallel do simd
171
172  ! ----------------------------------------------------------------------------
173  ! TARGET TEAMS DISTRIBUTE SIMD
174  ! ----------------------------------------------------------------------------
175  ! CHECK: omp.target
176  ! CHECK: omp.teams
177  ! CHECK: omp.distribute
178  ! CHECK-NEXT: omp.simd
179  ! CHECK-NEXT: omp.loop_nest
180  !$omp target teams distribute simd
181  do i = 1, 10
182  end do
183  !$omp end target teams distribute simd
184
185  ! ----------------------------------------------------------------------------
186  ! TEAMS DISTRIBUTE
187  ! ----------------------------------------------------------------------------
188  ! CHECK: omp.teams
189  ! CHECK: omp.distribute
190  ! CHECK-NEXT: omp.loop_nest
191  !$omp teams distribute
192  do i = 1, 10
193  end do
194  !$omp end teams distribute
195
196  ! ----------------------------------------------------------------------------
197  ! TEAMS DISTRIBUTE PARALLEL DO
198  ! ----------------------------------------------------------------------------
199  ! CHECK: omp.teams
200  ! CHECK: omp.parallel
201  ! CHECK: omp.distribute
202  ! CHECK-NEXT: omp.wsloop
203  ! CHECK-NEXT: omp.loop_nest
204  !$omp teams distribute parallel do
205  do i = 1, 10
206  end do
207  !$omp end teams distribute parallel do
208
209  ! ----------------------------------------------------------------------------
210  ! TEAMS DISTRIBUTE PARALLEL DO SIMD
211  ! ----------------------------------------------------------------------------
212  ! CHECK: omp.teams
213  ! CHECK: omp.parallel
214  ! CHECK: omp.distribute
215  ! CHECK-NEXT: omp.wsloop
216  ! CHECK-NEXT: omp.simd
217  ! CHECK-NEXT: omp.loop_nest
218  !$omp teams distribute parallel do simd
219  do i = 1, 10
220  end do
221  !$omp end teams distribute parallel do simd
222
223  ! ----------------------------------------------------------------------------
224  ! TEAMS DISTRIBUTE SIMD
225  ! ----------------------------------------------------------------------------
226  ! CHECK: omp.teams
227  ! CHECK: omp.distribute
228  ! CHECK-NEXT: omp.simd
229  ! CHECK-NEXT: omp.loop_nest
230  !$omp teams distribute simd
231  do i = 1, 10
232  end do
233  !$omp end teams distribute simd
234
235  ! ----------------------------------------------------------------------------
236  ! Unstructured control-flow in loop
237  ! ----------------------------------------------------------------------------
238  ! CHECK:      omp.target
239  ! CHECK:      omp.teams
240  ! CHECK:      omp.parallel
241  ! CHECK:      omp.distribute
242  ! CHECK-NEXT: omp.wsloop
243  ! CHECK-NEXT: omp.loop_nest
244  !
245  ! Verify the conrol-flow of the unstructured inner loop.
246  ! CHECK:        cf.br ^[[BB1:.*]]
247  ! CHECK:      ^[[BB1]]:
248  ! CHECK:        cf.br ^[[BB2:.*]]
249  ! CHECK:      ^[[BB2]]:
250  ! CHECK:        cf.cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
251  ! CHECK:      ^[[BB3]]:
252  ! CHECK:        cf.cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
253  ! CHECK:      ^[[BB4]]:
254  ! CHECK:        cf.br ^[[BB6]]
255  ! CHECK:      ^[[BB5]]:
256  ! CHECK:        cf.br ^[[BB2]]
257  ! CHECK:      ^[[BB6]]:
258  ! CHECK-NEXT:   omp.yield
259  !$omp target teams distribute parallel do
260  do i = 1, 10
261    outerloop: do j = i-1, i+i
262      if (j == i) then
263        exit outerloop
264      end if
265    end do outerloop
266  end do
267  !$omp end target teams distribute parallel do
268end program main
269