@@ -74,7 +74,6 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
7474 if (!loop.getPrivateVars ().empty ()) {
7575 mlir::OpBuilder::InsertionGuard guard (rewriter);
7676 rewriter.setInsertionPointToStart (&loop.getRegion ().front ());
77-
7877 std::optional<ArrayAttr> privateSyms = loop.getPrivateSyms ();
7978
8079 for (auto [privateVar, privateArg, privatizerSym] :
@@ -85,6 +84,27 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
8584
8685 mlir::Value localAlloc =
8786 rewriter.create <fir::AllocaOp>(loop.getLoc (), privatizer.getType ());
87+
88+ if (privatizer.getDataSharingType () ==
89+ omp::DataSharingClauseType::FirstPrivate) {
90+ mlir::Block *beforeLocalInit = rewriter.getInsertionBlock ();
91+ mlir::Block *afterLocalInit = rewriter.splitBlock (
92+ rewriter.getInsertionBlock (), rewriter.getInsertionPoint ());
93+ rewriter.cloneRegionBefore (privatizer.getCopyRegion (),
94+ afterLocalInit);
95+ mlir::Block *copyRegionFront = beforeLocalInit->getNextNode ();
96+ mlir::Block *copyRegionBack = afterLocalInit->getPrevNode ();
97+
98+ rewriter.setInsertionPoint (beforeLocalInit, beforeLocalInit->end ());
99+ rewriter.create <mlir::cf::BranchOp>(
100+ loc, copyRegionFront,
101+ llvm::SmallVector<mlir::Value>{privateVar, privateArg});
102+
103+ rewriter.eraseOp (copyRegionBack->getTerminator ());
104+ rewriter.setInsertionPoint (copyRegionBack, copyRegionBack->end ());
105+ rewriter.create <mlir::cf::BranchOp>(loc, afterLocalInit);
106+ }
107+
88108 rewriter.replaceAllUsesWith (privateArg, localAlloc);
89109 }
90110
0 commit comments