@@ -493,6 +493,7 @@ void DataSharingProcessor::collectDefaultSymbols() {
493
493
494
494
void DataSharingProcessor::privatize (
495
495
llvm::SetVector<mlir::omp::PrivateClauseOp> *privateInitializers) {
496
+ auto *op = firOpBuilder.getInsertionBlock ()->getParentOp ();
496
497
497
498
for (const Fortran::semantics::Symbol *sym : privatizedSymbols) {
498
499
@@ -516,9 +517,10 @@ void DataSharingProcessor::privatize(
516
517
Fortran::lower::SymbolBox hsb = converter.lookupOneLevelUpSymbol (*sym);
517
518
assert (hsb && " Host symbol box not found" );
518
519
520
+ auto symType = hsb.getAddr ().getType ();
521
+ auto symLoc = hsb.getAddr ().getLoc ();
519
522
auto privatizerOp = firOpBuilder.create <mlir::omp::PrivateClauseOp>(
520
- hsb.getAddr ().getLoc (), hsb.getAddr ().getType (),
521
- sym->name ().ToString ());
523
+ symLoc, symType, sym->name ().ToString ());
522
524
firOpBuilder.setInsertionPointToEnd (&privatizerOp.getBody ().front ());
523
525
524
526
converter.getLocalSymbols ()->pushScope ();
@@ -536,13 +538,18 @@ void DataSharingProcessor::privatize(
536
538
converter.getLocalSymbols ()->popScope ();
537
539
converter.getLocalSymbols ()->popScope ();
538
540
firOpBuilder.restoreInsertionPoint (ip);
539
- }
540
541
541
- // TODO: This will eventually be an else to the `if` above it. For now, I
542
- // emit both the outlined privatizer AND directly emitted cloning and
543
- // copying ops while I am testing.
544
- cloneSymbol (sym);
545
- copyFirstPrivateSymbol (sym);
542
+ privateInitializers->insert (privatizerOp);
543
+ auto blockArg = op->getRegion (0 ).front ().addArgument (symType, symLoc);
544
+ converter.bindSymbol (*sym, blockArg);
545
+ } else {
546
+
547
+ // TODO: This will eventually be an else to the `if` above it. For now,
548
+ // I emit both the outlined privatizer AND directly emitted cloning and
549
+ // copying ops while I am testing.
550
+ cloneSymbol (sym);
551
+ copyFirstPrivateSymbol (sym);
552
+ }
546
553
}
547
554
}
548
555
}
@@ -2376,8 +2383,10 @@ static void createBodyOfOp(
2376
2383
firOpBuilder.setInsertionPointToEnd (&op.getRegion ().back ());
2377
2384
auto *temp = Fortran::lower::genOpenMPTerminator (firOpBuilder,
2378
2385
op.getOperation (), loc);
2386
+
2379
2387
firOpBuilder.setInsertionPointAfter (marker);
2380
2388
genNestedEvaluations (converter, eval);
2389
+
2381
2390
temp->erase ();
2382
2391
}
2383
2392
0 commit comments