@@ -32,6 +32,19 @@ using namespace fir;
3232using namespace mlir ;
3333
3434namespace {
35+ // / Looks up from the operation from and returns the PrivateClauseOp with
36+ // / name symbolName
37+ // /
38+ // / TODO Copied from OpenMPToLLVMIRTranslation.cpp, move to a shared location.
39+ // / Maybe a static function on the `PrivateClauseOp`.
40+ static omp::PrivateClauseOp findPrivatizer (Operation *from,
41+ SymbolRefAttr symbolName) {
42+ omp::PrivateClauseOp privatizer =
43+ SymbolTable::lookupNearestSymbolFrom<omp::PrivateClauseOp>(from,
44+ symbolName);
45+ assert (privatizer && " privatizer not found in the symbol table" );
46+ return privatizer;
47+ }
3548
3649// Conversion of fir control ops to more primitive control-flow.
3750//
@@ -57,6 +70,30 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
5770 auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get (
5871 rewriter.getContext (), flags);
5972
73+ // Handle privatization
74+ if (!loop.getPrivateVars ().empty ()) {
75+ mlir::OpBuilder::InsertionGuard guard (rewriter);
76+ rewriter.setInsertionPointToStart (&loop.getRegion ().front ());
77+
78+ std::optional<ArrayAttr> privateSyms = loop.getPrivateSyms ();
79+
80+ for (auto [privateVar, privateArg, privatizerSym] :
81+ llvm::zip_equal (loop.getPrivateVars (), loop.getRegionPrivateArgs (),
82+ *privateSyms)) {
83+ SymbolRefAttr privatizerName = llvm::cast<SymbolRefAttr>(privatizerSym);
84+ omp::PrivateClauseOp privatizer = findPrivatizer (loop, privatizerName);
85+
86+ mlir::Value localAlloc =
87+ rewriter.create <fir::AllocaOp>(loop.getLoc (), privatizer.getType ());
88+ rewriter.replaceAllUsesWith (privateArg, localAlloc);
89+ }
90+
91+ loop.getRegion ().front ().eraseArguments (1 + loop.getNumRegionIterArgs (),
92+ loop.numPrivateBlockArgs ());
93+ loop.getPrivateVarsMutable ().clear ();
94+ loop.setPrivateSymsAttr (nullptr );
95+ }
96+
6097 // Create the start and end blocks that will wrap the DoLoopOp with an
6198 // initalizer and an end point
6299 auto *initBlock = rewriter.getInsertionBlock ();
0 commit comments