@@ -53,6 +53,15 @@ DataSharingProcessor::DataSharingProcessor(
5353 });
5454}
5555
56+ DataSharingProcessor::DataSharingProcessor (lower::AbstractConverter &converter,
57+ semantics::SemanticsContext &semaCtx,
58+ lower::pft::Evaluation &eval,
59+ bool useDelayedPrivatization,
60+ lower::SymMap &symTable)
61+ : DataSharingProcessor(converter, semaCtx, {}, eval,
62+ /* shouldCollectPreDeterminedSymols=*/ false ,
63+ useDelayedPrivatization, symTable) {}
64+
5665void DataSharingProcessor::processStep1 (
5766 mlir::omp::PrivateClauseOps *clauseOps) {
5867 collectSymbolsForPrivatization ();
@@ -172,7 +181,8 @@ void DataSharingProcessor::cloneSymbol(const semantics::Symbol *sym) {
172181
173182void DataSharingProcessor::copyFirstPrivateSymbol (
174183 const semantics::Symbol *sym, mlir::OpBuilder::InsertPoint *copyAssignIP) {
175- if (sym->test (semantics::Symbol::Flag::OmpFirstPrivate))
184+ if (sym->test (semantics::Symbol::Flag::OmpFirstPrivate) ||
185+ sym->test (semantics::Symbol::Flag::LocalityLocalInit))
176186 converter.copyHostAssociateVar (*sym, copyAssignIP);
177187}
178188
@@ -504,22 +514,29 @@ void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
504514 }
505515}
506516
507- void DataSharingProcessor::doPrivatize (const semantics::Symbol *sym ,
517+ void DataSharingProcessor::doPrivatize (const semantics::Symbol *symToPrivatize ,
508518 mlir::omp::PrivateClauseOps *clauseOps) {
509519 if (!useDelayedPrivatization) {
510- cloneSymbol (sym );
511- copyFirstPrivateSymbol (sym );
520+ cloneSymbol (symToPrivatize );
521+ copyFirstPrivateSymbol (symToPrivatize );
512522 return ;
513523 }
514524
515- lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol (*sym);
525+ const semantics::Symbol *sym = symToPrivatize->HasLocalLocality ()
526+ ? &symToPrivatize->GetUltimate ()
527+ : symToPrivatize;
528+ lower::SymbolBox hsb = symToPrivatize->HasLocalLocality ()
529+ ? converter.shallowLookupSymbol (*sym)
530+ : converter.lookupOneLevelUpSymbol (*sym);
516531 assert (hsb && " Host symbol box not found" );
517532 hlfir::Entity entity{hsb.getAddr ()};
518533 bool cannotHaveNonDefaultLowerBounds = !entity.mayHaveNonDefaultLowerBounds ();
519534
520535 mlir::Location symLoc = hsb.getAddr ().getLoc ();
521536 std::string privatizerName = sym->name ().ToString () + " .privatizer" ;
522- bool isFirstPrivate = sym->test (semantics::Symbol::Flag::OmpFirstPrivate);
537+ bool isFirstPrivate =
538+ symToPrivatize->test (semantics::Symbol::Flag::OmpFirstPrivate) ||
539+ symToPrivatize->test (semantics::Symbol::Flag::LocalityLocalInit);
523540
524541 mlir::Value privVal = hsb.getAddr ();
525542 mlir::Type allocType = privVal.getType ();
@@ -613,27 +630,30 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
613630 ©Region, /* insertPt=*/ {}, {argType, argType}, {symLoc, symLoc});
614631 firOpBuilder.setInsertionPointToEnd (copyEntryBlock);
615632
616- auto addSymbol = [&](unsigned argIdx, bool force = false ) {
633+ auto addSymbol = [&](unsigned argIdx, const semantics::Symbol *symToMap,
634+ bool force = false ) {
617635 symExV.match (
618636 [&](const fir::MutableBoxValue &box) {
619637 symTable.addSymbol (
620- *sym, fir::substBase (box, copyRegion. getArgument (argIdx)) ,
621- force);
638+ *symToMap ,
639+ fir::substBase (box, copyRegion. getArgument (argIdx)), force);
622640 },
623641 [&](const auto &box) {
624- symTable.addSymbol (*sym, copyRegion.getArgument (argIdx), force);
642+ symTable.addSymbol (*symToMap, copyRegion.getArgument (argIdx),
643+ force);
625644 });
626645 };
627646
628- addSymbol (0 , true );
647+ addSymbol (0 , sym, true );
629648 lower::SymMapScope innerScope (symTable);
630- addSymbol (1 );
649+ addSymbol (1 , symToPrivatize );
631650
632651 auto ip = firOpBuilder.saveInsertionPoint ();
633- copyFirstPrivateSymbol (sym , &ip);
652+ copyFirstPrivateSymbol (symToPrivatize , &ip);
634653
635654 firOpBuilder.create <mlir::omp::YieldOp>(
636- hsb.getAddr ().getLoc (), symTable.shallowLookupSymbol (*sym).getAddr ());
655+ hsb.getAddr ().getLoc (),
656+ symTable.shallowLookupSymbol (*symToPrivatize).getAddr ());
637657 }
638658
639659 return result;
@@ -645,6 +665,9 @@ void DataSharingProcessor::doPrivatize(const semantics::Symbol *sym,
645665 }
646666
647667 symToPrivatizer[sym] = privatizerOp;
668+
669+ if (symToPrivatize->HasLocalLocality ())
670+ allPrivatizedSymbols.insert (symToPrivatize);
648671}
649672
650673} // namespace omp
0 commit comments