Skip to content

Commit dc4bf2c

Browse files
[flang][OpenMP]Make omp.wsloop arguments appear in memory (#1277)
As per issue #1196, the loop induction variable, which is an argument in the omp.wsloop operation, does not have a memory location, so when passed to a function or subroutine, the reference to the value is not a memory location, but the value of the induction variable. The callee function/subroutine is then trying to dereference memory at address 1 or some other "not a good memory location". This is fixed by creating a temporary memory location and storing the value of the induction variable in that. Test fixes as a consequence of the changed code generated. Add checking for some of the omp-unstructured.f90 to check for alloca, store and load operations, to ensure the correct flow. Add a test for CYCLE inside a omp-do loop. Also convert to use -emit-fir in the omp-unstructrued, and make the symbol matching consistent in the omp-wsloop-variable test. Reviewed By: peixin Differential Revision: https://reviews.llvm.org/D126711
1 parent 5375353 commit dc4bf2c

File tree

7 files changed

+178
-91
lines changed

7 files changed

+178
-91
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "flang/Lower/OpenMP.h"
1414
#include "flang/Common/idioms.h"
1515
#include "flang/Lower/Bridge.h"
16+
#include "flang/Lower/ConvertExpr.h"
1617
#include "flang/Lower/PFTBuilder.h"
1718
#include "flang/Lower/StatementContext.h"
1819
#include "flang/Lower/Todo.h"
@@ -184,6 +185,7 @@ createBodyOfOp(Op &op, Fortran::lower::AbstractConverter &converter,
184185
// argument. Also update the symbol's address with the mlir argument value.
185186
// e.g. For loops the argument is the induction variable. And all further
186187
// uses of the induction variable should use this mlir value.
188+
mlir::Operation *storeOp = nullptr;
187189
if (args.size()) {
188190
std::size_t loopVarTypeSize = 0;
189191
for (const Fortran::semantics::Symbol *arg : args)
@@ -197,14 +199,25 @@ createBodyOfOp(Op &op, Fortran::lower::AbstractConverter &converter,
197199
}
198200
firOpBuilder.createBlock(&op.getRegion(), {}, tiv, locs);
199201
int argIndex = 0;
202+
// The argument is not currently in memory, so make a temporary for the
203+
// argument, and store it there, then bind that location to the argument.
200204
for (const Fortran::semantics::Symbol *arg : args) {
201-
fir::ExtendedValue exval = op.getRegion().front().getArgument(argIndex);
202-
converter.bindSymbol(*arg, exval);
205+
mlir::Value val =
206+
fir::getBase(op.getRegion().front().getArgument(argIndex));
207+
mlir::Value temp = firOpBuilder.createTemporary(
208+
loc, loopVarType,
209+
llvm::ArrayRef<mlir::NamedAttribute>{
210+
Fortran::lower::getAdaptToByRefAttr(firOpBuilder)});
211+
storeOp = firOpBuilder.create<fir::StoreOp>(loc, val, temp);
212+
converter.bindSymbol(*arg, temp);
203213
argIndex++;
204214
}
205215
} else {
206216
firOpBuilder.createBlock(&op.getRegion());
207217
}
218+
// Set the insert for the terminator operation to go at the end of the
219+
// block - this is either empty or the block with the stores above,
220+
// the end of the block works for both.
208221
mlir::Block &block = op.getRegion().back();
209222
firOpBuilder.setInsertionPointToEnd(&block);
210223

@@ -221,8 +234,11 @@ createBodyOfOp(Op &op, Fortran::lower::AbstractConverter &converter,
221234
firOpBuilder.create<mlir::omp::TerminatorOp>(loc);
222235
}
223236

224-
// Reset the insertion point to the start of the first block.
225-
firOpBuilder.setInsertionPointToStart(&block);
237+
// Reset the insert point to before the terminator.
238+
if (storeOp)
239+
firOpBuilder.setInsertionPointAfter(storeOp);
240+
else
241+
firOpBuilder.setInsertionPointToStart(&block);
226242

227243
// Handle privatization. Do not privatize if this is the outer operation.
228244
if (clauses && !outerCombined)

flang/test/Lower/OpenMP/omp-parallel-wsloop.f90

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ subroutine simple_parallel_do
1212
! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]])
1313
!$OMP PARALLEL DO
1414
do i=1, 9
15-
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[I]]) : (!fir.ref<i8>, i32) -> i1
15+
! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32>
16+
! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32>
17+
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1
1618
print*, i
1719
end do
1820
! CHECK: omp.yield
@@ -36,7 +38,9 @@ subroutine parallel_do_with_parallel_clauses(cond, nt)
3638
! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]])
3739
!$OMP PARALLEL DO IF(cond) NUM_THREADS(nt) PROC_BIND(close)
3840
do i=1, 9
39-
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[I]]) : (!fir.ref<i8>, i32) -> i1
41+
! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32>
42+
! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32>
43+
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1
4044
print*, i
4145
end do
4246
! CHECK: omp.yield
@@ -57,7 +61,9 @@ subroutine parallel_do_with_clauses(nt)
5761
! CHECK: omp.wsloop schedule(dynamic) for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]])
5862
!$OMP PARALLEL DO NUM_THREADS(nt) SCHEDULE(dynamic)
5963
do i=1, 9
60-
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[I]]) : (!fir.ref<i8>, i32) -> i1
64+
! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32>
65+
! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32>
66+
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1
6167
print*, i
6268
end do
6369
! CHECK: omp.yield
@@ -82,7 +88,9 @@ subroutine parallel_do_with_privatisation_clauses(cond,nt)
8288
! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]])
8389
!$OMP PARALLEL DO PRIVATE(cond) FIRSTPRIVATE(nt)
8490
do i=1, 9
85-
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[I]]) : (!fir.ref<i8>, i32) -> i1
91+
! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32>
92+
! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32>
93+
! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1
8694
! CHECK: %[[PRIVATE_COND_VAL:.*]] = fir.load %[[PRIVATE_COND_REF]] : !fir.ref<!fir.logical<4>>
8795
! CHECK: %[[PRIVATE_COND_VAL_CVT:.*]] = fir.convert %[[PRIVATE_COND_VAL]] : (!fir.logical<4>) -> i1
8896
! CHECK: fir.call @_FortranAioOutputLogical({{.*}}, %[[PRIVATE_COND_VAL_CVT]]) : (!fir.ref<i8>, i1) -> i1

flang/test/Lower/OpenMP/omp-unstructured.f90

Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
! Test unstructured code adjacent to and inside OpenMP constructs.
22

3-
! RUN: bbc %s -fopenmp -o "-" | FileCheck %s
3+
! RUN: bbc %s -fopenmp -emit-fir -o "-" | FileCheck %s
44

55
! CHECK-LABEL: func @_QPss1{{.*}} {
66
! 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
99
! 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
1313
! CHECK: br ^bb1
14-
! CHECK: ^bb4: // 2 preds: ^bb1, ^bb2
14+
! CHECK: ^bb5: // 2 preds: ^bb1, ^bb3
1515
! CHECK: omp.master {
1616
! CHECK: @_FortranAioBeginExternalListOutput
1717
! CHECK: omp.terminator
@@ -33,14 +33,14 @@ subroutine ss1(n) ! unstructured code followed by a structured OpenMP construct
3333
! CHECK: omp.master {
3434
! CHECK: @_FortranAioBeginExternalListOutput
3535
! 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
3838
! CHECK: ^bb2: // pred: ^bb1
39-
! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb3
39+
! CHECK: cond_br %{{[0-9]*}}, ^bb3, ^bb4
4040
! CHECK: ^bb3: // pred: ^bb2
4141
! CHECK: @_FortranAioBeginExternalListOutput
4242
! CHECK: br ^bb1
43-
! CHECK: ^bb4: // 2 preds: ^bb1, ^bb2
43+
! CHECK: ^bb5: // 2 preds: ^bb1, ^bb3
4444
! CHECK: omp.terminator
4545
! CHECK: }
4646
! CHECK: @_FortranAioBeginExternalListOutput
@@ -59,29 +59,38 @@ subroutine ss2(n) ! unstructured OpenMP construct; loop exit inside construct
5959
end
6060

6161
! 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}
6366
! 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
6669
! 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>
6872
! CHECK: @_FortranAioBeginExternalListOutput
73+
! CHECK: %[[LOAD_1:.*]] = fir.load %[[ALLOCA_2]] : !fir.ref<i32>
74+
! CHECK: @_FortranAioOutputInteger32(%{{.*}}, %[[LOAD_1]])
6975
! CHECK: omp.yield
7076
! CHECK: }
71-
! CHECK: omp.wsloop {{.*}} {
77+
! CHECK: omp.wsloop for (%[[ARG2:.*]]) : {{.*}} {
78+
! CHECK: fir.store %[[ARG2]] to %[[ALLOCA_1]] : !fir.ref<i32>
7279
! 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
7782
! CHECK: ^bb3: // pred: ^bb2
83+
! CHECK: cond_br %{{[0-9]*}}, ^bb4, ^bb5
84+
! CHECK: ^bb4: // pred: ^bb3
7885
! 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
8190
! CHECK: omp.yield
8291
! CHECK: }
8392
! CHECK: br ^bb1
84-
! CHECK: ^bb3: // pred: ^bb1
93+
! CHECK: ^bb4: // pred: ^bb1
8594
! CHECK: omp.terminator
8695
! CHECK: }
8796
! CHECK: }
@@ -107,13 +116,17 @@ subroutine ss3(n) ! nested unstructured OpenMP constructs
107116

108117
! CHECK-LABEL: func @_QPss4{{.*}} {
109118
! CHECK: omp.parallel {
119+
! CHECK: %[[ALLOCA:.*]] = fir.alloca i32 {{{.*}}, pinned}
110120
! 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]] {
113125
! 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: }
117130
! CHECK-NEXT: omp.yield
118131
! CHECK-NEXT: }
119132
! CHECK: omp.terminator
@@ -136,12 +149,16 @@ subroutine ss4(n) ! CYCLE in OpenMP wsloop constructs
136149
! CHECK: omp.wsloop {{.*}} {
137150
! CHECK: br ^[[BB1:.*]]
138151
! CHECK: ^[[BB1]]:
139-
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4:.*]]
152+
! CHECK: br ^[[BB2:.*]]
140153
! CHECK: ^[[BB2]]:
141-
! CHECK: cond_br %{{.*}}, ^[[BB4]], ^[[BB3:.*]]
154+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
142155
! CHECK: ^[[BB3]]:
143-
! CHECK: br ^[[BB1]]
156+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB3:.*]]
144157
! CHECK: ^[[BB4]]:
158+
! CHECK: br ^[[BB6]]
159+
! CHECK: ^[[BB3]]:
160+
! CHECK: br ^[[BB2]]
161+
! CHECK: ^[[BB6]]:
145162
! CHECK: omp.yield
146163
! CHECK: }
147164
! CHECK: omp.terminator
@@ -172,12 +189,16 @@ subroutine ss5() ! EXIT inside OpenMP wsloop (inside parallel)
172189
! CHECK: omp.wsloop {{.*}} {
173190
! CHECK: br ^[[BB1:.*]]
174191
! CHECK: ^[[BB1]]:
175-
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4:.*]]
192+
! CHECK: br ^[[BB2:.*]]
176193
! CHECK: ^[[BB2]]:
177-
! CHECK: cond_br %{{.*}}, ^[[BB4]], ^[[BB3:.*]]
194+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
178195
! CHECK: ^[[BB3]]:
179-
! CHECK: br ^[[BB1]]
196+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
180197
! CHECK: ^[[BB4]]:
198+
! CHECK: br ^[[BB6]]
199+
! CHECK: ^[[BB5]]
200+
! CHECK: br ^[[BB2]]
201+
! CHECK: ^[[BB6]]:
181202
! CHECK: omp.yield
182203
! CHECK: }
183204
! CHECK: br ^[[BB1_OUTER]]
@@ -212,12 +233,16 @@ subroutine ss6() ! EXIT inside OpenMP wsloop in a do loop (inside parallel)
212233
! CHECK: omp.wsloop {{.*}} {
213234
! CHECK: br ^[[BB1:.*]]
214235
! CHECK-NEXT: ^[[BB1]]:
215-
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4:.*]]
236+
! CHECK: br ^[[BB2:.*]]
216237
! CHECK-NEXT: ^[[BB2]]:
217-
! CHECK: cond_br %{{.*}}, ^[[BB4]], ^[[BB3:.*]]
238+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
218239
! CHECK-NEXT: ^[[BB3]]:
219-
! CHECK: br ^bb1
240+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
220241
! CHECK-NEXT: ^[[BB4]]:
242+
! CHECK: br ^[[BB6]]
243+
! CHECK-NEXT: ^[[BB5]]:
244+
! CHECK: br ^[[BB2]]
245+
! CHECK-NEXT: ^[[BB6]]:
221246
! CHECK: omp.yield
222247
! CHECK: }
223248
! CHECK: omp.terminator
@@ -245,13 +270,17 @@ subroutine ss7() ! EXIT inside OpenMP parallel do (inside do loop)
245270
! CHECK: omp.parallel {
246271
! CHECK: omp.wsloop {{.*}} {
247272
! CHECK: br ^[[BB1:.*]]
248-
! CHECK: ^[[BB1]]:
249-
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4:.*]]
273+
! CHECK-NEXT: ^[[BB1]]:
274+
! CHECK: br ^[[BB2:.*]]
250275
! CHECK: ^[[BB2]]:
251-
! CHECK: cond_br %{{.*}}, ^[[BB4]], ^[[BB3:.*]]
276+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]]
252277
! CHECK: ^[[BB3]]:
253-
! CHECK: br ^[[BB1]]
278+
! CHECK: cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]]
254279
! CHECK: ^[[BB4]]:
280+
! CHECK-NEXT: br ^[[BB6]]
281+
! CHECK: ^[[BB5]]:
282+
! CHECK: br ^[[BB2]]
283+
! CHECK-NEXT: ^[[BB6]]:
255284
! CHECK: omp.yield
256285
! CHECK: }
257286
! CHECK: omp.terminator
@@ -275,12 +304,14 @@ subroutine ss8() ! EXIT inside OpenMP parallel do
275304
! CHECK-NEXT: omp.parallel {
276305
! CHECK: br ^[[BB1:.*]]
277306
! CHECK: ^[[BB1]]:
278-
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB4:.*]]
307+
! CHECK: cond_br %{{.*}}, ^[[BB2:.*]], ^[[BB5:.*]]
279308
! CHECK-NEXT: ^[[BB2]]:
280-
! CHECK: cond_br %{{.*}}, ^[[BB4]], ^[[BB3:.*]]
309+
! CHECK: cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB4:.*]]
281310
! CHECK-NEXT: ^[[BB3]]:
282-
! CHECK: br ^[[BB1]]
311+
! CHECK-NEXT: br ^[[BB5]]
283312
! CHECK-NEXT: ^[[BB4]]:
313+
! CHECK: br ^[[BB1]]
314+
! CHECK-NEXT: ^[[BB5]]:
284315
! CHECK: omp.terminator
285316
! CHECK-NEXT: }
286317
! CHECK: omp.terminator

flang/test/Lower/OpenMP/omp-wsloop-chunks.f90

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ program wsloop
1919
! CHECK: %[[VAL_3:.*]] = arith.constant 9 : i32
2020
! CHECK: %[[VAL_4:.*]] = arith.constant 1 : i32
2121
! CHECK: %[[VAL_5:.*]] = arith.constant 4 : i32
22-
! CHECK: omp.wsloop schedule(static = %[[VAL_5]] : i32) nowait for (%[[VAL_6:.*]]) : i32 = (%[[VAL_2]]) to (%[[VAL_3]]) inclusive step (%[[VAL_4]]) {
23-
! CHECK: {{.*}} = fir.call @_FortranAioOutputInteger32({{.*}}, %[[VAL_6]]) : (!fir.ref<i8>, i32) -> i1
22+
! CHECK: omp.wsloop schedule(static = %[[VAL_5]] : i32) nowait for (%[[ARG0:.*]]) : i32 = (%[[VAL_2]]) to (%[[VAL_3]]) inclusive step (%[[VAL_4]]) {
23+
! CHECK: fir.store %[[ARG0]] to %[[STORE_IV:.*]] : !fir.ref<i32>
24+
! CHECK: %[[LOAD_IV:.*]] = fir.load %[[STORE_IV]] : !fir.ref<i32>
25+
! CHECK: {{.*}} = fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1
2426
! CHECK: omp.yield
2527
! CHECK: }
2628

@@ -35,9 +37,11 @@ program wsloop
3537
! CHECK: %[[VAL_15:.*]] = arith.constant 9 : i32
3638
! CHECK: %[[VAL_16:.*]] = arith.constant 1 : i32
3739
! CHECK: %[[VAL_17:.*]] = arith.constant 4 : i32
38-
! CHECK: omp.wsloop schedule(static = %[[VAL_17]] : i32) nowait for (%[[VAL_18:.*]]) : i32 = (%[[VAL_14]]) to (%[[VAL_15]]) inclusive step (%[[VAL_16]]) {
40+
! CHECK: omp.wsloop schedule(static = %[[VAL_17]] : i32) nowait for (%[[ARG1:.*]]) : i32 = (%[[VAL_14]]) to (%[[VAL_15]]) inclusive step (%[[VAL_16]]) {
41+
! CHECK: fir.store %[[ARG1]] to %[[STORE_IV1:.*]] : !fir.ref<i32>
3942
! CHECK: %[[VAL_24:.*]] = arith.constant 2 : i32
40-
! CHECK: %[[VAL_25:.*]] = arith.muli %[[VAL_24]], %[[VAL_18]] : i32
43+
! CHECK: %[[LOAD_IV1:.*]] = fir.load %[[STORE_IV1]] : !fir.ref<i32>
44+
! CHECK: %[[VAL_25:.*]] = arith.muli %[[VAL_24]], %[[LOAD_IV1]] : i32
4145
! CHECK: {{.*}} = fir.call @_FortranAioOutputInteger32({{.*}}, %[[VAL_25]]) : (!fir.ref<i8>, i32) -> i1
4246
! CHECK: omp.yield
4347
! CHECK: }
@@ -57,9 +61,11 @@ program wsloop
5761
! CHECK: %[[VAL_30:.*]] = arith.constant 9 : i32
5862
! CHECK: %[[VAL_31:.*]] = arith.constant 1 : i32
5963
! CHECK: %[[VAL_32:.*]] = fir.load %[[VAL_0]] : !fir.ref<i32>
60-
! CHECK: omp.wsloop schedule(static = %[[VAL_32]] : i32) nowait for (%[[VAL_33:.*]]) : i32 = (%[[VAL_29]]) to (%[[VAL_30]]) inclusive step (%[[VAL_31]]) {
64+
! CHECK: omp.wsloop schedule(static = %[[VAL_32]] : i32) nowait for (%[[ARG2:.*]]) : i32 = (%[[VAL_29]]) to (%[[VAL_30]]) inclusive step (%[[VAL_31]]) {
65+
! CHECK: fir.store %[[ARG2]] to %[[STORE_IV2:.*]] : !fir.ref<i32>
6166
! CHECK: %[[VAL_39:.*]] = arith.constant 3 : i32
62-
! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_39]], %[[VAL_33]] : i32
67+
! CHECK: %[[LOAD_IV2:.*]] = fir.load %[[STORE_IV2]] : !fir.ref<i32>
68+
! CHECK: %[[VAL_40:.*]] = arith.muli %[[VAL_39]], %[[LOAD_IV2]] : i32
6369
! CHECK: {{.*}} = fir.call @_FortranAioOutputInteger32({{.*}}, %[[VAL_40]]) : (!fir.ref<i8>, i32) -> i1
6470
! CHECK: omp.yield
6571
! CHECK: }

flang/test/Lower/OpenMP/omp-wsloop-collapse.f90

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,17 @@ program wsloop_collapse
3939
do i = 1, a
4040
do j= 1, b
4141
do k = 1, c
42-
! CHECK: omp.wsloop collapse(3) for (%[[VAL_9:.*]], %[[VAL_10:.*]], %[[VAL_11:.*]]) : i32 = (%[[VAL_20]], %[[VAL_23]], %[[VAL_26]]) to (%[[VAL_21]], %[[VAL_24]], %[[VAL_27]]) inclusive step (%[[VAL_22]], %[[VAL_25]], %[[VAL_28]]) {
42+
! CHECK: omp.wsloop collapse(3) for (%[[ARG0:.*]], %[[ARG1:.*]], %[[ARG2:.*]]) : i32 = (%[[VAL_20]], %[[VAL_23]], %[[VAL_26]]) to (%[[VAL_21]], %[[VAL_24]], %[[VAL_27]]) inclusive step (%[[VAL_22]], %[[VAL_25]], %[[VAL_28]]) {
43+
! CHECK: fir.store %[[ARG0]] to %[[STORE_IV0:.*]] : !fir.ref<i32>
44+
! CHECK: fir.store %[[ARG1]] to %[[STORE_IV1:.*]] : !fir.ref<i32>
45+
! CHECK: fir.store %[[ARG2]] to %[[STORE_IV2:.*]] : !fir.ref<i32>
4346
! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_6]] : !fir.ref<i32>
44-
! CHECK: %[[VAL_13:.*]] = arith.addi %[[VAL_12]], %[[VAL_9]] : i32
45-
! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_10]] : i32
46-
! CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_14]], %[[VAL_11]] : i32
47+
! CHECK: %[[LOAD_IV0:.*]] = fir.load %[[STORE_IV0]] : !fir.ref<i32>
48+
! CHECK: %[[VAL_13:.*]] = arith.addi %[[VAL_12]], %[[LOAD_IV0]] : i32
49+
! CHECK: %[[LOAD_IV1:.*]] = fir.load %[[STORE_IV1]] : !fir.ref<i32>
50+
! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[LOAD_IV1]] : i32
51+
! CHECK: %[[LOAD_IV2:.*]] = fir.load %[[STORE_IV2]] : !fir.ref<i32>
52+
! CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_14]], %[[LOAD_IV2]] : i32
4753
! CHECK: fir.store %[[VAL_15]] to %[[VAL_6]] : !fir.ref<i32>
4854
! CHECK: omp.yield
4955
! CHECK: }

0 commit comments

Comments
 (0)