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