@@ -29,9 +29,10 @@ void DataSharingProcessor::processStep1(
29
29
collectSymbolsForPrivatization ();
30
30
collectDefaultSymbols ();
31
31
collectImplicitSymbols ();
32
+ collectPreDeterminedSymbols ();
33
+
32
34
privatize (clauseOps, privateSyms);
33
- defaultPrivatize (clauseOps, privateSyms);
34
- implicitPrivatize (clauseOps, privateSyms);
35
+
35
36
insertBarrier ();
36
37
}
37
38
@@ -57,7 +58,7 @@ void DataSharingProcessor::processStep2(mlir::Operation *op, bool isLoop) {
57
58
}
58
59
59
60
void DataSharingProcessor::insertDeallocs () {
60
- for (const semantics::Symbol *sym : privatizedSymbols )
61
+ for (const semantics::Symbol *sym : allPrivatizedSymbols )
61
62
if (semantics::IsAllocatable (sym->GetUltimate ())) {
62
63
if (!useDelayedPrivatization) {
63
64
converter.createHostAssociateVarCloneDealloc (*sym);
@@ -92,10 +93,6 @@ void DataSharingProcessor::insertDeallocs() {
92
93
}
93
94
94
95
void DataSharingProcessor::cloneSymbol (const semantics::Symbol *sym) {
95
- // Privatization for symbols which are pre-determined (like loop index
96
- // variables) happen separately, for everything else privatize here.
97
- if (sym->test (semantics::Symbol::Flag::OmpPreDetermined))
98
- return ;
99
96
bool success = converter.createHostAssociateVarClone (*sym);
100
97
(void )success;
101
98
assert (success && " Privatization failed due to existing binding" );
@@ -126,20 +123,24 @@ void DataSharingProcessor::collectSymbolsForPrivatization() {
126
123
for (const omp::Clause &clause : clauses) {
127
124
if (const auto &privateClause =
128
125
std::get_if<omp::clause::Private>(&clause.u )) {
129
- collectOmpObjectListSymbol (privateClause->v , privatizedSymbols );
126
+ collectOmpObjectListSymbol (privateClause->v , explicitlyPrivatizedSymbols );
130
127
} else if (const auto &firstPrivateClause =
131
128
std::get_if<omp::clause::Firstprivate>(&clause.u )) {
132
- collectOmpObjectListSymbol (firstPrivateClause->v , privatizedSymbols);
129
+ collectOmpObjectListSymbol (firstPrivateClause->v ,
130
+ explicitlyPrivatizedSymbols);
133
131
} else if (const auto &lastPrivateClause =
134
132
std::get_if<omp::clause::Lastprivate>(&clause.u )) {
135
133
const ObjectList &objects = std::get<ObjectList>(lastPrivateClause->t );
136
- collectOmpObjectListSymbol (objects, privatizedSymbols );
134
+ collectOmpObjectListSymbol (objects, explicitlyPrivatizedSymbols );
137
135
hasLastPrivateOp = true ;
138
136
} else if (std::get_if<omp::clause::Collapse>(&clause.u )) {
139
137
hasCollapse = true ;
140
138
}
141
139
}
142
140
141
+ for (auto *sym : explicitlyPrivatizedSymbols)
142
+ allPrivatizedSymbols.insert (sym);
143
+
143
144
if (hasCollapse && hasLastPrivateOp)
144
145
TODO (converter.getCurrentLocation (), " Collapse clause with lastprivate" );
145
146
}
@@ -149,7 +150,7 @@ bool DataSharingProcessor::needBarrier() {
149
150
// initialization of firstprivate variables and post-update of lastprivate
150
151
// variables.
151
152
// Emit implicit barrier for linear clause. Maybe on somewhere else.
152
- for (const semantics::Symbol *sym : privatizedSymbols ) {
153
+ for (const semantics::Symbol *sym : allPrivatizedSymbols ) {
153
154
if (sym->test (semantics::Symbol::Flag::OmpFirstPrivate) &&
154
155
sym->test (semantics::Symbol::Flag::OmpLastPrivate))
155
156
return true ;
@@ -283,10 +284,40 @@ void DataSharingProcessor::collectSymbolsInNestedRegions(
283
284
if (nestedEval.isConstruct ())
284
285
// Recursively look for OpenMP constructs within `nestedEval`'s region
285
286
collectSymbolsInNestedRegions (nestedEval, flag, symbolsInNestedRegions);
286
- else
287
- converter.collectSymbolSet (nestedEval, symbolsInNestedRegions, flag,
288
- /* collectSymbols=*/ true ,
289
- /* collectHostAssociatedSymbols=*/ false );
287
+ else {
288
+ bool isOrderedConstruct = [&]() {
289
+ if (auto *ompConstruct =
290
+ nestedEval.getIf <parser::OpenMPConstruct>()) {
291
+ if (auto *ompBlockConstruct =
292
+ std::get_if<parser::OpenMPBlockConstruct>(
293
+ &ompConstruct->u )) {
294
+ const auto &beginBlockDirective =
295
+ std::get<parser::OmpBeginBlockDirective>(
296
+ ompBlockConstruct->t );
297
+ const auto origDirective =
298
+ std::get<parser::OmpBlockDirective>(beginBlockDirective.t ).v ;
299
+
300
+ return origDirective == llvm::omp::Directive::OMPD_ordered;
301
+ }
302
+ }
303
+
304
+ return false ;
305
+ }();
306
+
307
+ bool isCriticalConstruct = [&]() {
308
+ if (auto *ompConstruct =
309
+ nestedEval.getIf <parser::OpenMPConstruct>()) {
310
+ return std::get_if<parser::OpenMPCriticalConstruct>(
311
+ &ompConstruct->u ) != nullptr ;
312
+ }
313
+ return false ;
314
+ }();
315
+
316
+ if (!isOrderedConstruct && !isCriticalConstruct)
317
+ converter.collectSymbolSet (nestedEval, symbolsInNestedRegions, flag,
318
+ /* collectSymbols=*/ true ,
319
+ /* collectHostAssociatedSymbols=*/ false );
320
+ }
290
321
}
291
322
}
292
323
}
@@ -322,24 +353,39 @@ void DataSharingProcessor::collectSymbols(
322
353
converter.collectSymbolSet (eval, allSymbols, flag,
323
354
/* collectSymbols=*/ true ,
324
355
/* collectHostAssociatedSymbols=*/ true );
356
+
325
357
llvm::SetVector<const semantics::Symbol *> symbolsInNestedRegions;
326
358
collectSymbolsInNestedRegions (eval, flag, symbolsInNestedRegions);
327
359
// Filter-out symbols that must not be privatized.
328
360
bool collectImplicit = flag == semantics::Symbol::Flag::OmpImplicit;
361
+ bool collectPreDetermined = flag == semantics::Symbol::Flag::OmpPreDetermined;
362
+
329
363
auto isPrivatizable = [](const semantics::Symbol &sym) -> bool {
330
364
return !semantics::IsProcedure (sym) &&
331
365
!sym.GetUltimate ().has <semantics::DerivedTypeDetails>() &&
332
366
!sym.GetUltimate ().has <semantics::NamelistDetails>() &&
333
367
!semantics::IsImpliedDoIndex (sym.GetUltimate ());
334
368
};
369
+
370
+ auto shouldCollectSymbol = [&](const semantics::Symbol *sym) {
371
+ if (collectImplicit)
372
+ return sym->test (semantics::Symbol::Flag::OmpImplicit);
373
+
374
+ if (collectPreDetermined)
375
+ return sym->test (semantics::Symbol::Flag::OmpPreDetermined);
376
+
377
+ return !sym->test (semantics::Symbol::Flag::OmpImplicit) &&
378
+ !sym->test (semantics::Symbol::Flag::OmpPreDetermined);
379
+ };
380
+
335
381
for (const auto *sym : allSymbols) {
336
382
assert (curScope && " couldn't find current scope" );
337
383
if (isPrivatizable (*sym) && !symbolsInNestedRegions.contains (sym) &&
338
- !privatizedSymbols.contains (sym) &&
339
- !sym->test (semantics::Symbol::Flag::OmpPreDetermined) &&
340
- (collectImplicit || !sym->test (semantics::Symbol::Flag::OmpImplicit)) &&
341
- clauseScopes.contains (&sym->owner ()))
384
+ !explicitlyPrivatizedSymbols.contains (sym) &&
385
+ shouldCollectSymbol (sym) && clauseScopes.contains (&sym->owner ())) {
386
+ allPrivatizedSymbols.insert (sym);
342
387
symbols.insert (sym);
388
+ }
343
389
}
344
390
}
345
391
@@ -363,10 +409,16 @@ void DataSharingProcessor::collectImplicitSymbols() {
363
409
collectSymbols (semantics::Symbol::Flag::OmpImplicit, implicitSymbols);
364
410
}
365
411
412
+ void DataSharingProcessor::collectPreDeterminedSymbols () {
413
+ if (shouldCollectPreDeterminedSymbols)
414
+ collectSymbols (semantics::Symbol::Flag::OmpPreDetermined,
415
+ preDeterminedSymbols);
416
+ }
417
+
366
418
void DataSharingProcessor::privatize (
367
419
mlir::omp::PrivateClauseOps *clauseOps,
368
420
llvm::SmallVectorImpl<const semantics::Symbol *> *privateSyms) {
369
- for (const semantics::Symbol *sym : privatizedSymbols ) {
421
+ for (const semantics::Symbol *sym : allPrivatizedSymbols ) {
370
422
if (const auto *commonDet =
371
423
sym->detailsIf <semantics::CommonBlockDetails>()) {
372
424
for (const auto &mem : commonDet->objects ())
@@ -378,7 +430,7 @@ void DataSharingProcessor::privatize(
378
430
379
431
void DataSharingProcessor::copyLastPrivatize (mlir::Operation *op) {
380
432
insertLastPrivateCompare (op);
381
- for (const semantics::Symbol *sym : privatizedSymbols )
433
+ for (const semantics::Symbol *sym : allPrivatizedSymbols )
382
434
if (const auto *commonDet =
383
435
sym->detailsIf <semantics::CommonBlockDetails>()) {
384
436
for (const auto &mem : commonDet->objects ()) {
@@ -389,20 +441,6 @@ void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
389
441
}
390
442
}
391
443
392
- void DataSharingProcessor::defaultPrivatize (
393
- mlir::omp::PrivateClauseOps *clauseOps,
394
- llvm::SmallVectorImpl<const semantics::Symbol *> *privateSyms) {
395
- for (const semantics::Symbol *sym : defaultSymbols)
396
- doPrivatize (sym, clauseOps, privateSyms);
397
- }
398
-
399
- void DataSharingProcessor::implicitPrivatize (
400
- mlir::omp::PrivateClauseOps *clauseOps,
401
- llvm::SmallVectorImpl<const semantics::Symbol *> *privateSyms) {
402
- for (const semantics::Symbol *sym : implicitSymbols)
403
- doPrivatize (sym, clauseOps, privateSyms);
404
- }
405
-
406
444
void DataSharingProcessor::doPrivatize (
407
445
const semantics::Symbol *sym, mlir::omp::PrivateClauseOps *clauseOps,
408
446
llvm::SmallVectorImpl<const semantics::Symbol *> *privateSyms) {
0 commit comments