@@ -32,6 +32,19 @@ using namespace fir;
32
32
using namespace mlir ;
33
33
34
34
namespace {
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
+ }
35
48
36
49
// Conversion of fir control ops to more primitive control-flow.
37
50
//
@@ -57,6 +70,30 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
57
70
auto iofAttr = mlir::arith::IntegerOverflowFlagsAttr::get (
58
71
rewriter.getContext (), flags);
59
72
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
+
60
97
// Create the start and end blocks that will wrap the DoLoopOp with an
61
98
// initalizer and an end point
62
99
auto *initBlock = rewriter.getInsertionBlock ();
0 commit comments