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