2020#include " flang/Optimizer/Builder/BoxValue.h"
2121#include " flang/Optimizer/Builder/HLFIRTools.h"
2222#include " flang/Optimizer/Builder/Todo.h"
23+ #include " flang/Optimizer/Dialect/FIROps.h"
2324#include " flang/Optimizer/HLFIR/HLFIRDialect.h"
2425#include " flang/Optimizer/HLFIR/HLFIROps.h"
2526#include " flang/Semantics/attr.h"
@@ -53,6 +54,15 @@ DataSharingProcessor::DataSharingProcessor(
5354 });
5455}
5556
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+
5666void DataSharingProcessor::processStep1 (
5767 mlir::omp::PrivateClauseOps *clauseOps) {
5868 collectSymbolsForPrivatization ();
@@ -172,7 +182,8 @@ void DataSharingProcessor::cloneSymbol(const semantics::Symbol *sym) {
172182
173183void DataSharingProcessor::copyFirstPrivateSymbol (
174184 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))
176187 converter.copyHostAssociateVar (*sym, copyAssignIP);
177188}
178189
@@ -485,9 +496,9 @@ void DataSharingProcessor::privatize(mlir::omp::PrivateClauseOps *clauseOps) {
485496 if (const auto *commonDet =
486497 sym->detailsIf <semantics::CommonBlockDetails>()) {
487498 for (const auto &mem : commonDet->objects ())
488- doPrivatize (&*mem, clauseOps);
499+ privatizeSymbol (&*mem, clauseOps);
489500 } else
490- doPrivatize (sym, clauseOps);
501+ privatizeSymbol (sym, clauseOps);
491502 }
492503}
493504
@@ -504,22 +515,30 @@ void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
504515 }
505516}
506517
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) {
509521 if (!useDelayedPrivatization) {
510- cloneSymbol (sym );
511- copyFirstPrivateSymbol (sym );
522+ cloneSymbol (symToPrivatize );
523+ copyFirstPrivateSymbol (symToPrivatize );
512524 return ;
513525 }
514526
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);
516533 assert (hsb && " Host symbol box not found" );
517534 hlfir::Entity entity{hsb.getAddr ()};
518535 bool cannotHaveNonDefaultLowerBounds = !entity.mayHaveNonDefaultLowerBounds ();
519536
520537 mlir::Location symLoc = hsb.getAddr ().getLoc ();
521538 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);
523542
524543 mlir::Value privVal = hsb.getAddr ();
525544 mlir::Type allocType = privVal.getType ();
@@ -553,24 +572,33 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
553572
554573 mlir::Type argType = privVal.getType ();
555574
556- mlir::omp::PrivateClauseOp privatizerOp = [&]() {
575+ OpType privatizerOp = [&]() {
557576 auto moduleOp = firOpBuilder.getModule ();
558577 auto uniquePrivatizerName = fir::getTypeAsString (
559578 allocType, converter.getKindMap (),
560579 converter.mangleName (*sym) +
561580 (isFirstPrivate ? " _firstprivate" : " _private" ));
562581
563582 if (auto existingPrivatizer =
564- moduleOp.lookupSymbol <mlir::omp::PrivateClauseOp>(
565- uniquePrivatizerName))
583+ moduleOp.lookupSymbol <OpType>(uniquePrivatizerName))
566584 return existingPrivatizer;
567585
568586 mlir::OpBuilder::InsertionGuard guard (firOpBuilder);
569587 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+
574602 fir::ExtendedValue symExV = converter.getSymbolExtendedValue (*sym);
575603 lower::SymMapScope outerScope (symTable);
576604
@@ -613,27 +641,36 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
613641 ©Region, /* insertPt=*/ {}, {argType, argType}, {symLoc, symLoc});
614642 firOpBuilder.setInsertionPointToEnd (copyEntryBlock);
615643
616- auto addSymbol = [&](unsigned argIdx, bool force = false ) {
644+ auto addSymbol = [&](unsigned argIdx, const semantics::Symbol *symToMap,
645+ bool force = false ) {
617646 symExV.match (
618647 [&](const fir::MutableBoxValue &box) {
619648 symTable.addSymbol (
620- *sym, fir::substBase (box, copyRegion. getArgument (argIdx)) ,
621- force);
649+ *symToMap ,
650+ fir::substBase (box, copyRegion. getArgument (argIdx)), force);
622651 },
623652 [&](const auto &box) {
624- symTable.addSymbol (*sym, copyRegion.getArgument (argIdx), force);
653+ symTable.addSymbol (*symToMap, copyRegion.getArgument (argIdx),
654+ force);
625655 });
626656 };
627657
628- addSymbol (0 , true );
658+ addSymbol (0 , sym, true );
629659 lower::SymMapScope innerScope (symTable);
630- addSymbol (1 );
660+ addSymbol (1 , symToPrivatize );
631661
632662 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+ }
637674 }
638675
639676 return result;
@@ -644,9 +681,22 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
644681 clauseOps->privateVars .push_back (privVal);
645682 }
646683
647- symToPrivatizer[sym] = privatizerOp;
684+ if (symToPrivatize->HasLocalLocality ())
685+ allPrivatizedSymbols.insert (symToPrivatize);
648686}
649687
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+
650700} // namespace omp
651701} // namespace lower
652702} // namespace Fortran
0 commit comments