20
20
#include " flang/Optimizer/Builder/BoxValue.h"
21
21
#include " flang/Optimizer/Builder/HLFIRTools.h"
22
22
#include " flang/Optimizer/Builder/Todo.h"
23
+ #include " flang/Optimizer/Dialect/FIROps.h"
23
24
#include " flang/Optimizer/HLFIR/HLFIRDialect.h"
24
25
#include " flang/Optimizer/HLFIR/HLFIROps.h"
25
26
#include " flang/Semantics/attr.h"
@@ -53,6 +54,15 @@ DataSharingProcessor::DataSharingProcessor(
53
54
});
54
55
}
55
56
57
+ DataSharingProcessor::DataSharingProcessor (lower::AbstractConverter &converter,
58
+ semantics::SemanticsContext &semaCtx,
59
+ lower::pft::Evaluation &eval,
60
+ bool useDelayedPrivatization,
61
+ lower::SymMap &symTable)
62
+ : DataSharingProcessor(converter, semaCtx, {}, eval,
63
+ /* shouldCollectPreDeterminedSymols=*/ false ,
64
+ useDelayedPrivatization, symTable) {}
65
+
56
66
void DataSharingProcessor::processStep1 (
57
67
mlir::omp::PrivateClauseOps *clauseOps) {
58
68
collectSymbolsForPrivatization ();
@@ -172,7 +182,8 @@ void DataSharingProcessor::cloneSymbol(const semantics::Symbol *sym) {
172
182
173
183
void DataSharingProcessor::copyFirstPrivateSymbol (
174
184
const semantics::Symbol *sym, mlir::OpBuilder::InsertPoint *copyAssignIP) {
175
- if (sym->test (semantics::Symbol::Flag::OmpFirstPrivate))
185
+ if (sym->test (semantics::Symbol::Flag::OmpFirstPrivate) ||
186
+ sym->test (semantics::Symbol::Flag::LocalityLocalInit))
176
187
converter.copyHostAssociateVar (*sym, copyAssignIP);
177
188
}
178
189
@@ -485,9 +496,9 @@ void DataSharingProcessor::privatize(mlir::omp::PrivateClauseOps *clauseOps) {
485
496
if (const auto *commonDet =
486
497
sym->detailsIf <semantics::CommonBlockDetails>()) {
487
498
for (const auto &mem : commonDet->objects ())
488
- doPrivatize (&*mem, clauseOps);
499
+ privatizeSymbol (&*mem, clauseOps);
489
500
} else
490
- doPrivatize (sym, clauseOps);
501
+ privatizeSymbol (sym, clauseOps);
491
502
}
492
503
}
493
504
@@ -504,22 +515,30 @@ void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
504
515
}
505
516
}
506
517
507
- void DataSharingProcessor::doPrivatize (const semantics::Symbol *sym,
508
- mlir::omp::PrivateClauseOps *clauseOps) {
518
+ template <typename OpType, typename OperandsStructType>
519
+ void DataSharingProcessor::privatizeSymbol (
520
+ const semantics::Symbol *symToPrivatize, OperandsStructType *clauseOps) {
509
521
if (!useDelayedPrivatization) {
510
- cloneSymbol (sym );
511
- copyFirstPrivateSymbol (sym );
522
+ cloneSymbol (symToPrivatize );
523
+ copyFirstPrivateSymbol (symToPrivatize );
512
524
return ;
513
525
}
514
526
515
- lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol (*sym);
527
+ const semantics::Symbol *sym = symToPrivatize->HasLocalLocality ()
528
+ ? &symToPrivatize->GetUltimate ()
529
+ : symToPrivatize;
530
+ lower::SymbolBox hsb = symToPrivatize->HasLocalLocality ()
531
+ ? converter.shallowLookupSymbol (*sym)
532
+ : converter.lookupOneLevelUpSymbol (*sym);
516
533
assert (hsb && " Host symbol box not found" );
517
534
hlfir::Entity entity{hsb.getAddr ()};
518
535
bool cannotHaveNonDefaultLowerBounds = !entity.mayHaveNonDefaultLowerBounds ();
519
536
520
537
mlir::Location symLoc = hsb.getAddr ().getLoc ();
521
538
std::string privatizerName = sym->name ().ToString () + " .privatizer" ;
522
- bool isFirstPrivate = sym->test (semantics::Symbol::Flag::OmpFirstPrivate);
539
+ bool isFirstPrivate =
540
+ symToPrivatize->test (semantics::Symbol::Flag::OmpFirstPrivate) ||
541
+ symToPrivatize->test (semantics::Symbol::Flag::LocalityLocalInit);
523
542
524
543
mlir::Value privVal = hsb.getAddr ();
525
544
mlir::Type allocType = privVal.getType ();
@@ -553,24 +572,33 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
553
572
554
573
mlir::Type argType = privVal.getType ();
555
574
556
- mlir::omp::PrivateClauseOp privatizerOp = [&]() {
575
+ OpType privatizerOp = [&]() {
557
576
auto moduleOp = firOpBuilder.getModule ();
558
577
auto uniquePrivatizerName = fir::getTypeAsString (
559
578
allocType, converter.getKindMap (),
560
579
converter.mangleName (*sym) +
561
580
(isFirstPrivate ? " _firstprivate" : " _private" ));
562
581
563
582
if (auto existingPrivatizer =
564
- moduleOp.lookupSymbol <mlir::omp::PrivateClauseOp>(
565
- uniquePrivatizerName))
583
+ moduleOp.lookupSymbol <OpType>(uniquePrivatizerName))
566
584
return existingPrivatizer;
567
585
568
586
mlir::OpBuilder::InsertionGuard guard (firOpBuilder);
569
587
firOpBuilder.setInsertionPointToStart (moduleOp.getBody ());
570
- auto result = firOpBuilder.create <mlir::omp::PrivateClauseOp>(
571
- symLoc, uniquePrivatizerName, allocType,
572
- isFirstPrivate ? mlir::omp::DataSharingClauseType::FirstPrivate
573
- : mlir::omp::DataSharingClauseType::Private);
588
+ OpType result;
589
+
590
+ if constexpr (std::is_same_v<OpType, mlir::omp::PrivateClauseOp>) {
591
+ result = firOpBuilder.create <OpType>(
592
+ symLoc, uniquePrivatizerName, allocType,
593
+ isFirstPrivate ? mlir::omp::DataSharingClauseType::FirstPrivate
594
+ : mlir::omp::DataSharingClauseType::Private);
595
+ } else {
596
+ result = firOpBuilder.create <OpType>(
597
+ symLoc, uniquePrivatizerName, allocType,
598
+ isFirstPrivate ? fir::LocalitySpecifierType::LocalInit
599
+ : fir::LocalitySpecifierType::Local);
600
+ }
601
+
574
602
fir::ExtendedValue symExV = converter.getSymbolExtendedValue (*sym);
575
603
lower::SymMapScope outerScope (symTable);
576
604
@@ -613,27 +641,36 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
613
641
©Region, /* insertPt=*/ {}, {argType, argType}, {symLoc, symLoc});
614
642
firOpBuilder.setInsertionPointToEnd (copyEntryBlock);
615
643
616
- auto addSymbol = [&](unsigned argIdx, bool force = false ) {
644
+ auto addSymbol = [&](unsigned argIdx, const semantics::Symbol *symToMap,
645
+ bool force = false ) {
617
646
symExV.match (
618
647
[&](const fir::MutableBoxValue &box) {
619
648
symTable.addSymbol (
620
- *sym, fir::substBase (box, copyRegion. getArgument (argIdx)) ,
621
- force);
649
+ *symToMap ,
650
+ fir::substBase (box, copyRegion. getArgument (argIdx)), force);
622
651
},
623
652
[&](const auto &box) {
624
- symTable.addSymbol (*sym, copyRegion.getArgument (argIdx), force);
653
+ symTable.addSymbol (*symToMap, copyRegion.getArgument (argIdx),
654
+ force);
625
655
});
626
656
};
627
657
628
- addSymbol (0 , true );
658
+ addSymbol (0 , sym, true );
629
659
lower::SymMapScope innerScope (symTable);
630
- addSymbol (1 );
660
+ addSymbol (1 , symToPrivatize );
631
661
632
662
auto ip = firOpBuilder.saveInsertionPoint ();
633
- copyFirstPrivateSymbol (sym, &ip);
634
-
635
- firOpBuilder.create <mlir::omp::YieldOp>(
636
- hsb.getAddr ().getLoc (), symTable.shallowLookupSymbol (*sym).getAddr ());
663
+ copyFirstPrivateSymbol (symToPrivatize, &ip);
664
+
665
+ if constexpr (std::is_same_v<OpType, mlir::omp::PrivateClauseOp>) {
666
+ firOpBuilder.create <mlir::omp::YieldOp>(
667
+ hsb.getAddr ().getLoc (),
668
+ symTable.shallowLookupSymbol (*symToPrivatize).getAddr ());
669
+ } else {
670
+ firOpBuilder.create <fir::YieldOp>(
671
+ hsb.getAddr ().getLoc (),
672
+ symTable.shallowLookupSymbol (*symToPrivatize).getAddr ());
673
+ }
637
674
}
638
675
639
676
return result;
@@ -644,9 +681,22 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
644
681
clauseOps->privateVars .push_back (privVal);
645
682
}
646
683
647
- symToPrivatizer[sym] = privatizerOp;
684
+ if (symToPrivatize->HasLocalLocality ())
685
+ allPrivatizedSymbols.insert (symToPrivatize);
648
686
}
649
687
688
+ template void
689
+ DataSharingProcessor::privatizeSymbol<mlir::omp::PrivateClauseOp,
690
+ mlir::omp::PrivateClauseOps>(
691
+ const semantics::Symbol *symToPrivatize,
692
+ mlir::omp::PrivateClauseOps *clauseOps);
693
+
694
+ template void
695
+ DataSharingProcessor::privatizeSymbol<fir::LocalitySpecifierOp,
696
+ fir::LocalitySpecifierOperands>(
697
+ const semantics::Symbol *symToPrivatize,
698
+ fir::LocalitySpecifierOperands *clauseOps);
699
+
650
700
} // namespace omp
651
701
} // namespace lower
652
702
} // namespace Fortran
0 commit comments