1
1
! Test unstructured code adjacent to and inside OpenMP constructs.
2
2
3
- ! RUN: bbc %s -fopenmp -o "-" | FileCheck %s
3
+ ! RUN: bbc %s -fopenmp -emit-fir - o "-" | FileCheck %s
4
4
5
5
! CHECK-LABEL: func @_QPss1{{.*}} {
6
6
! CHECK: br ^bb1
7
- ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb3
8
- ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb4
7
+ ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb4
8
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb5
9
9
! CHECK: ^bb2: // pred: ^bb1
10
- ! CHECK: cond_br %{{[0-9]*}}, ^bb4 , ^bb3
11
- ! CHECK: ^bb3 : // pred: ^bb2
12
- ! CHECK: @_FortranAioBeginExternalListOutput
10
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb3 , ^bb4
11
+ ! CHECK: ^bb4 : // pred: ^bb2
12
+ ! CHECK: fir.call @_FortranAioBeginExternalListOutput
13
13
! CHECK: br ^bb1
14
- ! CHECK: ^bb4 : // 2 preds: ^bb1, ^bb2
14
+ ! CHECK: ^bb5 : // 2 preds: ^bb1, ^bb3
15
15
! CHECK: omp.master {
16
16
! CHECK: @_FortranAioBeginExternalListOutput
17
17
! CHECK: omp.terminator
@@ -33,14 +33,14 @@ subroutine ss1(n) ! unstructured code followed by a structured OpenMP construct
33
33
! CHECK: omp.master {
34
34
! CHECK: @_FortranAioBeginExternalListOutput
35
35
! CHECK: br ^bb1
36
- ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb3
37
- ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb4
36
+ ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb4
37
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb5
38
38
! CHECK: ^bb2: // pred: ^bb1
39
- ! CHECK: cond_br %{{[0-9]*}}, ^bb4 , ^bb3
39
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb3 , ^bb4
40
40
! CHECK: ^bb3: // pred: ^bb2
41
41
! CHECK: @_FortranAioBeginExternalListOutput
42
42
! CHECK: br ^bb1
43
- ! CHECK: ^bb4 : // 2 preds: ^bb1, ^bb2
43
+ ! CHECK: ^bb5 : // 2 preds: ^bb1, ^bb3
44
44
! CHECK: omp.terminator
45
45
! CHECK: }
46
46
! CHECK: @_FortranAioBeginExternalListOutput
@@ -59,29 +59,38 @@ subroutine ss2(n) ! unstructured OpenMP construct; loop exit inside construct
59
59
end
60
60
61
61
! CHECK-LABEL: func @_QPss3{{.*}} {
62
- ! CHECK: omp.parallel {
62
+ ! CHECK: %[[ALLOCA_K:.*]] = fir.alloca i32 {bindc_name = "k", {{.*}}}
63
+ ! CHECK: omp.parallel {
64
+ ! CHECK: %[[ALLOCA_1:.*]] = fir.alloca i32 {{{.*}}, pinned}
65
+ ! CHECK: %[[ALLOCA_2:.*]] = fir.alloca i32 {{{.*}}, pinned}
63
66
! CHECK: br ^bb1
64
- ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb2
65
- ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb3
67
+ ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb3
68
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb4
66
69
! CHECK: ^bb2: // pred: ^bb1
67
- ! CHECK: omp.wsloop {{.*}} {
70
+ ! CHECK: omp.wsloop for (%[[ARG1:.*]]) : {{.*}} {
71
+ ! CHECK: fir.store %[[ARG1]] to %[[ALLOCA_2]] : !fir.ref<i32>
68
72
! CHECK: @_FortranAioBeginExternalListOutput
73
+ ! CHECK: %[[LOAD_1:.*]] = fir.load %[[ALLOCA_2]] : !fir.ref<i32>
74
+ ! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_1]])
69
75
! CHECK: omp.yield
70
76
! CHECK: }
71
- ! CHECK: omp.wsloop {{.*}} {
77
+ ! CHECK: omp.wsloop for (%[[ARG2:.*]]) : {{.*}} {
78
+ ! CHECK: fir.store %[[ARG2]] to %[[ALLOCA_1]] : !fir.ref<i32>
72
79
! CHECK: br ^bb1
73
- ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb3
74
- ! CHECK: cond_br %{{[0-9]*}}, ^bb2, ^bb4
75
- ! CHECK: ^bb2: // pred: ^bb1
76
- ! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb3
80
+ ! CHECK: ^bb2: // 2 preds: ^bb1, ^bb5
81
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb6
77
82
! CHECK: ^bb3: // pred: ^bb2
83
+ ! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb5
84
+ ! CHECK: ^bb4: // pred: ^bb3
78
85
! CHECK: @_FortranAioBeginExternalListOutput
79
- ! CHECK: br ^bb1
80
- ! CHECK: ^bb4: // 2 preds: ^bb1, ^bb2
86
+ ! CHECK: %[[LOAD_2:.*]] = fir.load %[[ALLOCA_K]] : !fir.ref<i32>
87
+ ! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_2]])
88
+ ! CHECK: br ^bb2
89
+ ! CHECK: ^bb6: // 2 preds: ^bb2, ^bb4
81
90
! CHECK: omp.yield
82
91
! CHECK: }
83
92
! CHECK: br ^bb1
84
- ! CHECK: ^bb3 : // pred: ^bb1
93
+ ! CHECK: ^bb4 : // pred: ^bb1
85
94
! CHECK: omp.terminator
86
95
! CHECK: }
87
96
! CHECK: }
@@ -107,13 +116,17 @@ subroutine ss3(n) ! nested unstructured OpenMP constructs
107
116
108
117
! CHECK-LABEL: func @_QPss4{{.*}} {
109
118
! CHECK: omp.parallel {
119
+ ! CHECK: %[[ALLOCA:.*]] = fir.alloca i32 {{{.*}}, pinned}
110
120
! CHECK: omp.wsloop for (%[[ARG:.*]]) : {{.*}} {
111
- ! CHECK: cond_br %{{.*}}, ^bb1, ^bb2
112
- ! CHECK: ^bb1:
121
+ ! CHECK: fir.store %[[ARG]] to %[[ALLOCA]] : !fir.ref<i32>
122
+ ! CHECK: %[[COND:.*]] = arith.cmpi eq, %{{.*}}, %{{.*}}
123
+ ! CHECK: %[[COND_XOR:.*]] = arith.xori %[[COND]], %{{.*}}
124
+ ! CHECK: fir.if %[[COND_XOR]] {
113
125
! CHECK: @_FortranAioBeginExternalListOutput
114
- ! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[ARG]])
115
- ! CHECK: br ^bb2
116
- ! CHECK: ^bb2:
126
+ ! CHECK: %[[LOAD:.*]] = fir.load %[[ALLOCA]] : !fir.ref<i32>
127
+ ! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD]])
128
+ ! CHECK: } else {
129
+ ! CHECK: }
117
130
! CHECK-NEXT: omp.yield
118
131
! CHECK-NEXT: }
119
132
! CHECK: omp.terminator
@@ -136,12 +149,16 @@ subroutine ss4(n) ! CYCLE in OpenMP wsloop constructs
136
149
! CHECK: omp.wsloop {{.*}} {
137
150
! CHECK: br ^[[BB1:.*]]
138
151
! CHECK: ^[[BB1]]:
139
- ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4 :.*]]
152
+ ! CHECK: br ^[[BB2:.*]]
140
153
! CHECK: ^[[BB2]]:
141
- ! CHECK: cond_br %{{.*}}, ^[[BB4 ]], ^[[BB3 :.*]]
154
+ ! CHECK: cond_br %{{.*}}, ^[[BB3:.* ]], ^[[BB6 :.*]]
142
155
! CHECK: ^[[BB3]]:
143
- ! CHECK: br ^[[BB1 ]]
156
+ ! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB3:.* ]]
144
157
! CHECK: ^[[BB4]]:
158
+ ! CHECK: br ^[[BB6]]
159
+ ! CHECK: ^[[BB3]]:
160
+ ! CHECK: br ^[[BB2]]
161
+ ! CHECK: ^[[BB6]]:
145
162
! CHECK: omp.yield
146
163
! CHECK: }
147
164
! CHECK: omp.terminator
@@ -172,12 +189,16 @@ subroutine ss5() ! EXIT inside OpenMP wsloop (inside parallel)
172
189
! CHECK: omp.wsloop {{.*}} {
173
190
! CHECK: br ^[[BB1:.*]]
174
191
! CHECK: ^[[BB1]]:
175
- ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4 :.*]]
192
+ ! CHECK: br ^[[BB2:.*]]
176
193
! CHECK: ^[[BB2]]:
177
- ! CHECK: cond_br %{{.*}}, ^[[BB4 ]], ^[[BB3 :.*]]
194
+ ! CHECK: cond_br %{{.*}}, ^[[BB3:.* ]], ^[[BB6 :.*]]
178
195
! CHECK: ^[[BB3]]:
179
- ! CHECK: br ^[[BB1 ]]
196
+ ! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.* ]]
180
197
! CHECK: ^[[BB4]]:
198
+ ! CHECK: br ^[[BB6]]
199
+ ! CHECK: ^[[BB5]]
200
+ ! CHECK: br ^[[BB2]]
201
+ ! CHECK: ^[[BB6]]:
181
202
! CHECK: omp.yield
182
203
! CHECK: }
183
204
! CHECK: br ^[[BB1_OUTER]]
@@ -212,12 +233,16 @@ subroutine ss6() ! EXIT inside OpenMP wsloop in a do loop (inside parallel)
212
233
! CHECK: omp.wsloop {{.*}} {
213
234
! CHECK: br ^[[BB1:.*]]
214
235
! CHECK-NEXT: ^[[BB1]]:
215
- ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4 :.*]]
236
+ ! CHECK: br ^[[BB2:.*]]
216
237
! CHECK-NEXT: ^[[BB2]]:
217
- ! CHECK: cond_br %{{.*}}, ^[[BB4 ]], ^[[BB3 :.*]]
238
+ ! CHECK: cond_br %{{.*}}, ^[[BB3:.* ]], ^[[BB6 :.*]]
218
239
! CHECK-NEXT: ^[[BB3]]:
219
- ! CHECK: br ^bb1
240
+ ! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
220
241
! CHECK-NEXT: ^[[BB4]]:
242
+ ! CHECK: br ^[[BB6]]
243
+ ! CHECK-NEXT: ^[[BB5]]:
244
+ ! CHECK: br ^[[BB2]]
245
+ ! CHECK-NEXT: ^[[BB6]]:
221
246
! CHECK: omp.yield
222
247
! CHECK: }
223
248
! CHECK: omp.terminator
@@ -245,13 +270,17 @@ subroutine ss7() ! EXIT inside OpenMP parallel do (inside do loop)
245
270
! CHECK: omp.parallel {
246
271
! CHECK: omp.wsloop {{.*}} {
247
272
! CHECK: br ^[[BB1:.*]]
248
- ! CHECK: ^[[BB1]]:
249
- ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4 :.*]]
273
+ ! CHECK-NEXT : ^[[BB1]]:
274
+ ! CHECK: br ^[[BB2:.*]]
250
275
! CHECK: ^[[BB2]]:
251
- ! CHECK: cond_br %{{.*}}, ^[[BB4 ]], ^[[BB3 :.*]]
276
+ ! CHECK: cond_br %{{.*}}, ^[[BB3:.* ]], ^[[BB6 :.*]]
252
277
! CHECK: ^[[BB3]]:
253
- ! CHECK: br ^[[BB1 ]]
278
+ ! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.* ]]
254
279
! CHECK: ^[[BB4]]:
280
+ ! CHECK-NEXT: br ^[[BB6]]
281
+ ! CHECK: ^[[BB5]]:
282
+ ! CHECK: br ^[[BB2]]
283
+ ! CHECK-NEXT: ^[[BB6]]:
255
284
! CHECK: omp.yield
256
285
! CHECK: }
257
286
! CHECK: omp.terminator
@@ -275,12 +304,14 @@ subroutine ss8() ! EXIT inside OpenMP parallel do
275
304
! CHECK-NEXT: omp.parallel {
276
305
! CHECK: br ^[[BB1:.*]]
277
306
! CHECK: ^[[BB1]]:
278
- ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4 :.*]]
307
+ ! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB5 :.*]]
279
308
! CHECK-NEXT: ^[[BB2]]:
280
- ! CHECK: cond_br %{{.*}}, ^[[BB4 ]], ^[[BB3 :.*]]
309
+ ! CHECK: cond_br %{{.*}}, ^[[BB3:.* ]], ^[[BB4 :.*]]
281
310
! CHECK-NEXT: ^[[BB3]]:
282
- ! CHECK: br ^[[BB1 ]]
311
+ ! CHECK-NEXT : br ^[[BB5 ]]
283
312
! CHECK-NEXT: ^[[BB4]]:
313
+ ! CHECK: br ^[[BB1]]
314
+ ! CHECK-NEXT: ^[[BB5]]:
284
315
! CHECK: omp.terminator
285
316
! CHECK-NEXT: }
286
317
! CHECK: omp.terminator
0 commit comments