Skip to content

Commit 749a7a6

Browse files
committed
[flang] Basic lowering of fir.do_loop's local_init specifier
1 parent c8cf5a6 commit 749a7a6

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)