Skip to content

Commit 6261c45

Browse files
committed
[flang] Basic lowering of fir.do_loop locality specifiers
1 parent 68d9c7b commit 6261c45

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

flang/include/flang/Optimizer/Dialect/FIROps.td

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,20 +2284,14 @@ def fir_DoLoopOp : region_Op<"do_loop", [AttrSizedOperandSegments,
22842284
.slice(getNumControlOperands() + getNumReduceOperands(),
22852285
getNumIterOperands());
22862286
}
2287-
mlir::Operation::operand_range getPrivateOperands() {
2288-
return getOperands()
2289-
.slice(getNumControlOperands() + getNumReduceOperands()
2290-
+ getNumIterOperands(),
2291-
numPrivateBlockArgs());
2292-
}
22932287

22942288
void setLowerBound(mlir::Value bound) { (*this)->setOperand(0, bound); }
22952289
void setUpperBound(mlir::Value bound) { (*this)->setOperand(1, bound); }
22962290
void setStep(mlir::Value step) { (*this)->setOperand(2, step); }
22972291

22982292
/// Number of region arguments for loop-carried values
22992293
unsigned getNumRegionIterArgs() {
2300-
return getBody()->getNumArguments() - 1;
2294+
return getNumIterOperands();
23012295
}
23022296
/// Number of operands controlling the loop: lb, ub, step
23032297
unsigned getNumControlOperands() { return 3; }

flang/lib/Optimizer/Transforms/ControlFlowConverter.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,19 @@ using namespace fir;
3232
using namespace mlir;
3333

3434
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+
}
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

Comments
 (0)