@@ -74,7 +74,6 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
74
74
if (!loop.getPrivateVars ().empty ()) {
75
75
mlir::OpBuilder::InsertionGuard guard (rewriter);
76
76
rewriter.setInsertionPointToStart (&loop.getRegion ().front ());
77
-
78
77
std::optional<ArrayAttr> privateSyms = loop.getPrivateSyms ();
79
78
80
79
for (auto [privateVar, privateArg, privatizerSym] :
@@ -85,6 +84,27 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
85
84
86
85
mlir::Value localAlloc =
87
86
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
+
88
108
rewriter.replaceAllUsesWith (privateArg, localAlloc);
89
109
}
90
110
0 commit comments