Skip to content

Commit 903faef

Browse files
[Flang][OpenMP] Port three tests to HLFIR flow
These are copies of tests from flang/test/Lower/OpenMP/FIR
1 parent e9c101a commit 903faef

File tree

3 files changed

+457
-0
lines changed

3 files changed

+457
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s
2+
3+
!CHECK: func.func @_QPfirstprivate_common() {
4+
!CHECK: %[[val_0:.*]] = fir.address_of(@c_) : !fir.ref<!fir.array<8xi8>>
5+
!CHECK: %[[val_1:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
6+
!CHECK: %[[val_c0:.*]] = arith.constant 0 : index
7+
!CHECK: %[[val_2:.*]] = fir.coordinate_of %[[val_1]], %[[val_c0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
8+
!CHECK: %[[val_3:.*]] = fir.convert %[[val_2]] : (!fir.ref<i8>) -> !fir.ref<f32>
9+
!CHECK: %[[VAL_3_DECL:.*]]:2 = hlfir.declare %[[val_3]] {uniq_name = "_QFfirstprivate_commonEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
10+
!CHECK: %[[val_4:.*]] = fir.convert %[[val_0]] : (!fir.ref<!fir.array<8xi8>>) -> !fir.ref<!fir.array<?xi8>>
11+
!CHECK: %[[val_c4:.*]] = arith.constant 4 : index
12+
!CHECK: %[[val_5:.*]] = fir.coordinate_of %[[val_4]], %[[val_c4]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
13+
!CHECK: %[[val_6:.*]] = fir.convert %[[val_5]] : (!fir.ref<i8>) -> !fir.ref<f32>
14+
!CHECK: %[[VAL_6_DECL:.*]]:2 = hlfir.declare %[[val_6]] {uniq_name = "_QFfirstprivate_commonEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
15+
!CHECK: omp.parallel {
16+
!CHECK: %[[val_7:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFfirstprivate_commonEx"}
17+
!CHECK: %[[VAL_7_DECL:.*]]:2 = hlfir.declare %[[val_7]] {uniq_name = "_QFfirstprivate_commonEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
18+
!CHECK: %[[val_8:.*]] = fir.load %[[VAL_3_DECL]]#1 : !fir.ref<f32>
19+
!CHECK: fir.store %[[val_8]] to %[[VAL_7_DECL]]#1 : !fir.ref<f32>
20+
!CHECK: %[[val_9:.*]] = fir.alloca f32 {bindc_name = "y", pinned, uniq_name = "_QFfirstprivate_commonEy"}
21+
!CHECK: %[[VAL_9_DECL:.*]]:2 = hlfir.declare %[[val_9]] {uniq_name = "_QFfirstprivate_commonEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
22+
!CHECK: %[[val_10:.*]] = fir.load %[[VAL_6_DECL]]#1 : !fir.ref<f32>
23+
!CHECK: fir.store %[[val_10]] to %[[VAL_9_DECL]]#1 : !fir.ref<f32>
24+
!CHECK: omp.terminator
25+
!CHECK: }
26+
!CHECK: return
27+
!CHECK: }
28+
29+
subroutine firstprivate_common
30+
common /c/ x, y
31+
real x, y
32+
!$omp parallel firstprivate(/c/)
33+
!$omp end parallel
34+
end subroutine
Lines changed: 348 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,348 @@
1+
! Test unstructured code adjacent to and inside OpenMP constructs.
2+
3+
! RUN: bbc %s -fopenmp -emit-hlfir -o "-" | FileCheck %s
4+
5+
! CHECK-LABEL: func @_QPss1{{.*}} {
6+
! CHECK: br ^bb1
7+
! CHECK: ^bb1: // 2 preds: ^bb0, ^bb4
8+
! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb5
9+
! CHECK: ^bb2: // pred: ^bb1
10+
! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb4
11+
! CHECK: ^bb4: // pred: ^bb2
12+
! CHECK: fir.call @_FortranAioBeginExternalListOutput
13+
! CHECK: br ^bb1
14+
! CHECK: ^bb5: // 2 preds: ^bb1, ^bb3
15+
! CHECK: omp.master {
16+
! CHECK: @_FortranAioBeginExternalListOutput
17+
! CHECK: omp.terminator
18+
! CHECK: }
19+
! CHECK: @_FortranAioBeginExternalListOutput
20+
! CHECK: }
21+
subroutine ss1(n) ! unstructured code followed by a structured OpenMP construct
22+
do i = 1, 3
23+
if (i .eq. n) exit
24+
print*, 'ss1-A', i
25+
enddo
26+
!$omp master
27+
print*, 'ss1-B', i
28+
!$omp end master
29+
print*
30+
end
31+
32+
! CHECK-LABEL: func @_QPss2{{.*}} {
33+
! CHECK: omp.master {
34+
! CHECK: @_FortranAioBeginExternalListOutput
35+
! CHECK: br ^bb1
36+
! CHECK: ^bb1: // 2 preds: ^bb0, ^bb4
37+
! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb5
38+
! CHECK: ^bb2: // pred: ^bb1
39+
! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb4
40+
! CHECK: ^bb3: // pred: ^bb2
41+
! CHECK: @_FortranAioBeginExternalListOutput
42+
! CHECK: br ^bb1
43+
! CHECK: ^bb5: // 2 preds: ^bb1, ^bb3
44+
! CHECK: omp.terminator
45+
! CHECK: }
46+
! CHECK: @_FortranAioBeginExternalListOutput
47+
! CHECK: @_FortranAioBeginExternalListOutput
48+
! CHECK: }
49+
subroutine ss2(n) ! unstructured OpenMP construct; loop exit inside construct
50+
!$omp master
51+
print*, 'ss2-A', n
52+
do i = 1, 3
53+
if (i .eq. n) exit
54+
print*, 'ss2-B', i
55+
enddo
56+
!$omp end master
57+
print*, 'ss2-C', i
58+
print*
59+
end
60+
61+
! CHECK-LABEL: func @_QPss3{{.*}} {
62+
! CHECK: omp.parallel {
63+
! CHECK: %[[ALLOCA_K:.*]] = fir.alloca i32 {bindc_name = "k", pinned}
64+
! CHECK: %[[K_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_K]] {uniq_name = "_QFss3Ek"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
65+
! CHECK: %[[ALLOCA_1:.*]] = fir.alloca i32 {{{.*}}, pinned}
66+
! CHECK: %[[OMP_LOOP_J_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_1]] {uniq_name = "_QFss3Ej"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
67+
! CHECK: %[[ALLOCA_2:.*]] = fir.alloca i32 {{{.*}}, pinned}
68+
! CHECK: %[[OMP_LOOP_K_DECL:.*]]:2 = hlfir.declare %[[ALLOCA_2]] {uniq_name = "_QFss3Ek"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
69+
! CHECK: br ^bb1
70+
! CHECK: ^bb1: // 2 preds: ^bb0, ^bb3
71+
! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb4
72+
! CHECK: ^bb2: // pred: ^bb1
73+
! CHECK: omp.wsloop for (%[[ARG1:.*]]) : {{.*}} {
74+
! CHECK: fir.store %[[ARG1]] to %[[OMP_LOOP_K_DECL]]#1 : !fir.ref<i32>
75+
! CHECK: @_FortranAioBeginExternalListOutput
76+
! CHECK: %[[LOAD_1:.*]] = fir.load %[[OMP_LOOP_K_DECL]]#0 : !fir.ref<i32>
77+
! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_1]])
78+
! CHECK: omp.yield
79+
! CHECK: }
80+
! CHECK: omp.wsloop for (%[[ARG2:.*]]) : {{.*}} {
81+
! CHECK: fir.store %[[ARG2]] to %[[OMP_LOOP_J_DECL]]#1 : !fir.ref<i32>
82+
! CHECK: br ^bb1
83+
! CHECK: ^bb2: // 2 preds: ^bb1, ^bb5
84+
! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb6
85+
! CHECK: ^bb3: // pred: ^bb2
86+
! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb5
87+
! CHECK: ^bb4: // pred: ^bb3
88+
! CHECK: @_FortranAioBeginExternalListOutput
89+
! CHECK: %[[LOAD_2:.*]] = fir.load %[[K_DECL]]#0 : !fir.ref<i32>
90+
! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_2]])
91+
! CHECK: br ^bb2
92+
! CHECK: ^bb6: // 2 preds: ^bb2, ^bb4
93+
! CHECK: omp.yield
94+
! CHECK: }
95+
! CHECK: br ^bb1
96+
! CHECK: ^bb4: // pred: ^bb1
97+
! CHECK: omp.terminator
98+
! CHECK: }
99+
! CHECK: }
100+
subroutine ss3(n) ! nested unstructured OpenMP constructs
101+
!$omp parallel
102+
do i = 1, 3
103+
!$omp do
104+
do k = 1, 3
105+
print*, 'ss3-A', k
106+
enddo
107+
!$omp end do
108+
!$omp do
109+
do j = 1, 3
110+
do k = 1, 3
111+
if (k .eq. n) exit
112+
print*, 'ss3-B', k
113+
enddo
114+
enddo
115+
!$omp end do
116+
enddo
117+
!$omp end parallel
118+
end
119+
120+
! CHECK-LABEL: func @_QPss4{{.*}} {
121+
! CHECK: omp.parallel {
122+
! CHECK: %[[ALLOCA:.*]] = fir.alloca i32 {{{.*}}, pinned}
123+
! CHECK: %[[OMP_LOOP_J_DECL:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "_QFss4Ej"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
124+
! CHECK: omp.wsloop for (%[[ARG:.*]]) : {{.*}} {
125+
! CHECK: fir.store %[[ARG]] to %[[OMP_LOOP_J_DECL]]#1 : !fir.ref<i32>
126+
! CHECK: %[[COND:.*]] = arith.cmpi eq, %{{.*}}, %{{.*}}
127+
! CHECK: %[[COND_XOR:.*]] = arith.xori %[[COND]], %{{.*}}
128+
! CHECK: fir.if %[[COND_XOR]] {
129+
! CHECK: @_FortranAioBeginExternalListOutput
130+
! CHECK: %[[LOAD:.*]] = fir.load %[[OMP_LOOP_J_DECL]]#0 : !fir.ref<i32>
131+
! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD]])
132+
! CHECK: } else {
133+
! CHECK: }
134+
! CHECK-NEXT: omp.yield
135+
! CHECK-NEXT: }
136+
! CHECK: omp.terminator
137+
! CHECK-NEXT:}
138+
subroutine ss4(n) ! CYCLE in OpenMP wsloop constructs
139+
!$omp parallel
140+
do i = 1, 3
141+
!$omp do
142+
do j = 1, 3
143+
if (j .eq. n) cycle
144+
print*, 'ss4', j
145+
enddo
146+
!$omp end do
147+
enddo
148+
!$omp end parallel
149+
end
150+
151+
! CHECK-LABEL: func @_QPss5() {
152+
! CHECK: omp.parallel {
153+
! CHECK: omp.wsloop {{.*}} {
154+
! CHECK: br ^[[BB1:.*]]
155+
! CHECK: ^[[BB1]]:
156+
! CHECK: br ^[[BB2:.*]]
157+
! CHECK: ^[[BB2]]:
158+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
159+
! CHECK: ^[[BB3]]:
160+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB3:.*]]
161+
! CHECK: ^[[BB4]]:
162+
! CHECK: br ^[[BB6]]
163+
! CHECK: ^[[BB3]]:
164+
! CHECK: br ^[[BB2]]
165+
! CHECK: ^[[BB6]]:
166+
! CHECK: omp.yield
167+
! CHECK: }
168+
! CHECK: omp.terminator
169+
! CHECK: }
170+
subroutine ss5() ! EXIT inside OpenMP wsloop (inside parallel)
171+
integer :: x
172+
!$omp parallel private(x)
173+
!$omp do
174+
do j = 1, 3
175+
x = j * i
176+
do k = 1, 3
177+
if (k .eq. n) exit
178+
x = k
179+
x = x + k
180+
enddo
181+
x = j - 222
182+
enddo
183+
!$omp end do
184+
!$omp end parallel
185+
end
186+
187+
! CHECK-LABEL: func @_QPss6() {
188+
! CHECK: omp.parallel {
189+
! CHECK: br ^[[BB1_OUTER:.*]]
190+
! CHECK: ^[[BB1_OUTER]]:
191+
! CHECK: cond_br %{{.*}}, ^[[BB2_OUTER:.*]], ^[[BB3_OUTER:.*]]
192+
! CHECK: ^[[BB2_OUTER]]:
193+
! CHECK: omp.wsloop {{.*}} {
194+
! CHECK: br ^[[BB1:.*]]
195+
! CHECK: ^[[BB1]]:
196+
! CHECK: br ^[[BB2:.*]]
197+
! CHECK: ^[[BB2]]:
198+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
199+
! CHECK: ^[[BB3]]:
200+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
201+
! CHECK: ^[[BB4]]:
202+
! CHECK: br ^[[BB6]]
203+
! CHECK: ^[[BB5]]
204+
! CHECK: br ^[[BB2]]
205+
! CHECK: ^[[BB6]]:
206+
! CHECK: omp.yield
207+
! CHECK: }
208+
! CHECK: br ^[[BB1_OUTER]]
209+
! CHECK: ^[[BB3_OUTER]]:
210+
! CHECK: omp.terminator
211+
! CHECK: }
212+
subroutine ss6() ! EXIT inside OpenMP wsloop in a do loop (inside parallel)
213+
integer :: x
214+
!$omp parallel private(x)
215+
do i = 1, 3
216+
!$omp do
217+
do j = 1, 3
218+
x = j * i
219+
do k = 1, 3
220+
if (k .eq. n) exit
221+
x = k
222+
x = x + k
223+
enddo
224+
x = j - 222
225+
enddo
226+
!$omp end do
227+
enddo
228+
!$omp end parallel
229+
end
230+
231+
! CHECK-LABEL: func @_QPss7() {
232+
! CHECK: br ^[[BB1_OUTER:.*]]
233+
! CHECK: ^[[BB1_OUTER]]:
234+
! CHECK: cond_br %{{.*}}, ^[[BB2_OUTER:.*]], ^[[BB3_OUTER:.*]]
235+
! CHECK-NEXT: ^[[BB2_OUTER:.*]]:
236+
! CHECK: omp.parallel {
237+
! CHECK: omp.wsloop {{.*}} {
238+
! CHECK: br ^[[BB1:.*]]
239+
! CHECK-NEXT: ^[[BB1]]:
240+
! CHECK: br ^[[BB2:.*]]
241+
! CHECK-NEXT: ^[[BB2]]:
242+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
243+
! CHECK-NEXT: ^[[BB3]]:
244+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
245+
! CHECK-NEXT: ^[[BB4]]:
246+
! CHECK: br ^[[BB6]]
247+
! CHECK-NEXT: ^[[BB5]]:
248+
! CHECK: br ^[[BB2]]
249+
! CHECK-NEXT: ^[[BB6]]:
250+
! CHECK: omp.yield
251+
! CHECK: }
252+
! CHECK: omp.terminator
253+
! CHECK: }
254+
! CHECK: br ^[[BB1_OUTER]]
255+
! CHECK-NEXT: ^[[BB3_OUTER]]:
256+
! CHECK-NEXT: return
257+
subroutine ss7() ! EXIT inside OpenMP parallel do (inside do loop)
258+
integer :: x
259+
do i = 1, 3
260+
!$omp parallel do private(x)
261+
do j = 1, 3
262+
x = j * i
263+
do k = 1, 3
264+
if (k .eq. n) exit
265+
x = k
266+
x = x + k
267+
enddo
268+
enddo
269+
!$omp end parallel do
270+
enddo
271+
end
272+
273+
! CHECK-LABEL: func @_QPss8() {
274+
! CHECK: omp.parallel {
275+
! CHECK: omp.wsloop {{.*}} {
276+
! CHECK: br ^[[BB1:.*]]
277+
! CHECK-NEXT: ^[[BB1]]:
278+
! CHECK: br ^[[BB2:.*]]
279+
! CHECK: ^[[BB2]]:
280+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
281+
! CHECK: ^[[BB3]]:
282+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
283+
! CHECK: ^[[BB4]]:
284+
! CHECK-NEXT: br ^[[BB6]]
285+
! CHECK: ^[[BB5]]:
286+
! CHECK: br ^[[BB2]]
287+
! CHECK-NEXT: ^[[BB6]]:
288+
! CHECK: omp.yield
289+
! CHECK: }
290+
! CHECK: omp.terminator
291+
! CHECK: }
292+
subroutine ss8() ! EXIT inside OpenMP parallel do
293+
integer :: x
294+
!$omp parallel do private(x)
295+
do j = 1, 3
296+
x = j * i
297+
do k = 1, 3
298+
if (k .eq. n) exit
299+
x = k
300+
x = x + k
301+
enddo
302+
enddo
303+
!$omp end parallel do
304+
end
305+
306+
! CHECK-LABEL: func @_QPss9() {
307+
! CHECK: omp.parallel {
308+
! CHECK-NEXT: omp.parallel {
309+
! CHECK: br ^[[BB1:.*]]
310+
! CHECK: ^[[BB1]]:
311+
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB5:.*]]
312+
! CHECK-NEXT: ^[[BB2]]:
313+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB4:.*]]
314+
! CHECK-NEXT: ^[[BB3]]:
315+
! CHECK-NEXT: br ^[[BB5]]
316+
! CHECK-NEXT: ^[[BB4]]:
317+
! CHECK: br ^[[BB1]]
318+
! CHECK-NEXT: ^[[BB5]]:
319+
! CHECK: omp.terminator
320+
! CHECK-NEXT: }
321+
! CHECK: omp.terminator
322+
! CHECK-NEXT }
323+
! CHECK: }
324+
subroutine ss9() ! EXIT inside OpenMP parallel (inside parallel)
325+
integer :: x
326+
!$omp parallel
327+
!$omp parallel private(x)
328+
do k = 1, 3
329+
if (k .eq. n) exit
330+
x = k
331+
x = x + k
332+
end do
333+
!$omp end parallel
334+
!$omp end parallel
335+
end
336+
337+
! CHECK-LABEL: func @_QQmain
338+
program p
339+
call ss1(2)
340+
call ss2(2)
341+
call ss3(2)
342+
call ss4(2)
343+
call ss5()
344+
call ss6()
345+
call ss7()
346+
call ss8()
347+
call ss9()
348+
end

0 commit comments

Comments
 (0)