21
21
#include " llvm/ADT/STLExtras.h"
22
22
#include " llvm/ADT/iterator_range.h"
23
23
24
+ #include < mlir/Dialect/OpenMP/OpenMPClauseOperands.h>
24
25
#include < variant>
25
26
26
27
namespace flangomp {
@@ -73,7 +74,7 @@ static bool isSafeToParallelize(Operation *op) {
73
74
// /
74
75
// / omp.workshare {
75
76
// / %a = fir.allocmem
76
- // / omp.wsloop {}
77
+ // / omp.workshare_loop_wrapper {}
77
78
// / fir.call Assign %b %a
78
79
// / fir.freemem %a
79
80
// / }
@@ -85,7 +86,7 @@ static bool isSafeToParallelize(Operation *op) {
85
86
// / fir.store %a %tmp
86
87
// / }
87
88
// / %a_reloaded = fir.load %tmp
88
- // / omp.wsloop {}
89
+ // / omp.workshare_loop_wrapper {}
89
90
// / omp.single {
90
91
// / fir.call Assign %b %a_reloaded
91
92
// / fir.freemem %a_reloaded
@@ -180,20 +181,20 @@ void lowerWorkshare(mlir::omp::WorkshareOp wsOp) {
180
181
assert (wsBlock->getTerminator ()->getNumOperands () == 0 );
181
182
Operation *terminator = wsBlock->getTerminator ();
182
183
183
- SmallVector<std::variant<SingleRegion, omp::WsloopOp >> regions;
184
+ SmallVector<std::variant<SingleRegion, omp::WorkshareLoopWrapperOp >> regions;
184
185
185
186
auto it = wsBlock->begin ();
186
187
auto getSingleRegion = [&]() {
187
188
if (&*it == terminator)
188
189
return false ;
189
- if (auto pop = dyn_cast<omp::WsloopOp >(&*it)) {
190
+ if (auto pop = dyn_cast<omp::WorkshareLoopWrapperOp >(&*it)) {
190
191
regions.push_back (pop);
191
192
it++;
192
193
return true ;
193
194
}
194
195
SingleRegion sr;
195
196
sr.begin = it;
196
- while (&*it != terminator && !isa<omp::WsloopOp >(&*it))
197
+ while (&*it != terminator && !isa<omp::WorkshareLoopWrapperOp >(&*it))
197
198
it++;
198
199
sr.end = it;
199
200
assert (sr.begin != sr.end );
@@ -214,9 +215,16 @@ void lowerWorkshare(mlir::omp::WorkshareOp wsOp) {
214
215
singleBuilder.createBlock (&singleOp.getRegion ());
215
216
moveToSingle (std::get<SingleRegion>(loopOrSingle), singleBuilder);
216
217
} 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 ();
220
228
}
221
229
}
222
230
0 commit comments