Skip to content

Commit db4fc37

Browse files
committed
Change to workshare loop wrapper op
1 parent 3ab40e1 commit db4fc37

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

flang/lib/Optimizer/OpenMP/LowerWorkshare.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "llvm/ADT/STLExtras.h"
2222
#include "llvm/ADT/iterator_range.h"
2323

24+
#include <mlir/Dialect/OpenMP/OpenMPClauseOperands.h>
2425
#include <variant>
2526

2627
namespace flangomp {
@@ -73,7 +74,7 @@ static bool isSafeToParallelize(Operation *op) {
7374
///
7475
/// omp.workshare {
7576
/// %a = fir.allocmem
76-
/// omp.wsloop {}
77+
/// omp.workshare_loop_wrapper {}
7778
/// fir.call Assign %b %a
7879
/// fir.freemem %a
7980
/// }
@@ -85,7 +86,7 @@ static bool isSafeToParallelize(Operation *op) {
8586
/// fir.store %a %tmp
8687
/// }
8788
/// %a_reloaded = fir.load %tmp
88-
/// omp.wsloop {}
89+
/// omp.workshare_loop_wrapper {}
8990
/// omp.single {
9091
/// fir.call Assign %b %a_reloaded
9192
/// fir.freemem %a_reloaded
@@ -180,20 +181,20 @@ void lowerWorkshare(mlir::omp::WorkshareOp wsOp) {
180181
assert(wsBlock->getTerminator()->getNumOperands() == 0);
181182
Operation *terminator = wsBlock->getTerminator();
182183

183-
SmallVector<std::variant<SingleRegion, omp::WsloopOp>> regions;
184+
SmallVector<std::variant<SingleRegion, omp::WorkshareLoopWrapperOp>> regions;
184185

185186
auto it = wsBlock->begin();
186187
auto getSingleRegion = [&]() {
187188
if (&*it == terminator)
188189
return false;
189-
if (auto pop = dyn_cast<omp::WsloopOp>(&*it)) {
190+
if (auto pop = dyn_cast<omp::WorkshareLoopWrapperOp>(&*it)) {
190191
regions.push_back(pop);
191192
it++;
192193
return true;
193194
}
194195
SingleRegion sr;
195196
sr.begin = it;
196-
while (&*it != terminator && !isa<omp::WsloopOp>(&*it))
197+
while (&*it != terminator && !isa<omp::WorkshareLoopWrapperOp>(&*it))
197198
it++;
198199
sr.end = it;
199200
assert(sr.begin != sr.end);
@@ -214,9 +215,16 @@ void lowerWorkshare(mlir::omp::WorkshareOp wsOp) {
214215
singleBuilder.createBlock(&singleOp.getRegion());
215216
moveToSingle(std::get<SingleRegion>(loopOrSingle), singleBuilder);
216217
} else {
217-
rootBuilder.clone(*std::get<omp::WsloopOp>(loopOrSingle), rootMapping);
218-
if (!isLast)
219-
rootBuilder.create<omp::BarrierOp>(loc);
218+
omp::WsloopOperands wsloopOperands;
219+
if (isLast)
220+
wsloopOperands.nowait = rootBuilder.getUnitAttr();
221+
auto wsloop =
222+
rootBuilder.create<mlir::omp::WsloopOp>(loc, wsloopOperands);
223+
auto wslw = std::get<omp::WorkshareLoopWrapperOp>(loopOrSingle);
224+
auto clonedWslw = cast<omp::WorkshareLoopWrapperOp>(
225+
rootBuilder.clone(*wslw, rootMapping));
226+
wsloop.getRegion().takeBody(clonedWslw.getRegion());
227+
clonedWslw->erase();
220228
}
221229
}
222230

flang/test/HLFIR/bufferize-workshare.fir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]](%[[VAL_3]]) {uniq_name = ".tmp.array"} : (!fir.heap<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<42xi32>>, !fir.heap<!fir.array<42xi32>>)
1313
// CHECK: %[[VAL_7:.*]] = arith.constant true
1414
// CHECK: %[[VAL_8:.*]] = arith.constant 1 : index
15-
// CHECK: omp.wsloop {
15+
// CHECK: "omp.workshare_loop_wrapper"() ({
1616
// CHECK: omp.loop_nest (%[[VAL_9:.*]]) : index = (%[[VAL_8]]) to (%[[VAL_1]]) inclusive step (%[[VAL_8]]) {
1717
// CHECK: %[[VAL_10:.*]] = hlfir.designate %[[VAL_4]]#0 (%[[VAL_9]]) : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
1818
// CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>
@@ -22,7 +22,7 @@
2222
// CHECK: omp.yield
2323
// CHECK: }
2424
// CHECK: omp.terminator
25-
// CHECK: }
25+
// CHECK: }) : () -> ()
2626
// CHECK: %[[VAL_14:.*]] = fir.undefined tuple<!fir.heap<!fir.array<42xi32>>, i1>
2727
// CHECK: %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_7]], [1 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
2828
// CHECK: %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[VAL_6]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, !fir.heap<!fir.array<42xi32>>) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>

flang/test/Transforms/OpenMP/lower-workshare.mlir

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ module {
3434
// CHECK: }
3535
// CHECK: omp.terminator
3636
// CHECK: }
37-
// CHECK: omp.barrier
3837
// CHECK: omp.single nowait {
3938
// CHECK: hlfir.assign %[[VAL_14]] to %[[VAL_13]] : !fir.heap<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>
4039
// CHECK: fir.freemem %[[VAL_14]] : !fir.heap<!fir.array<42xi32>>
@@ -56,7 +55,7 @@ module {
5655
%3:2 = hlfir.declare %2(%0) {uniq_name = ".tmp.array"} : (!fir.heap<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<42xi32>>, !fir.heap<!fir.array<42xi32>>)
5756
%true = arith.constant true
5857
%c1 = arith.constant 1 : index
59-
omp.wsloop {
58+
"omp.workshare_loop_wrapper"() ({
6059
omp.loop_nest (%arg1) : index = (%c1) to (%c42) inclusive step (%c1) {
6160
%7 = hlfir.designate %1#0 (%arg1) : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
6261
%8 = fir.load %7 : !fir.ref<i32>
@@ -66,7 +65,7 @@ module {
6665
omp.yield
6766
}
6867
omp.terminator
69-
}
68+
}) : () -> ()
7069
%4 = fir.undefined tuple<!fir.heap<!fir.array<42xi32>>, i1>
7170
%5 = fir.insert_value %4, %true, [1 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
7271
%6 = fir.insert_value %5, %3#0, [0 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, !fir.heap<!fir.array<42xi32>>) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>

0 commit comments

Comments
 (0)