Skip to content

Commit c8cf5a6

Browse files
committed
[flang] Basic lowering of fir.do_loop locality specifiers
1 parent bb165a2 commit c8cf5a6

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
@@ -2229,20 +2229,14 @@ def fir_DoLoopOp : region_Op<"do_loop", [AttrSizedOperandSegments,
22292229
.slice(getNumControlOperands() + getNumReduceOperands(),
22302230
getNumIterOperands());
22312231
}
2232-
mlir::Operation::operand_range getPrivateOperands() {
2233-
return getOperands()
2234-
.slice(getNumControlOperands() + getNumReduceOperands()
2235-
+ getNumIterOperands(),
2236-
numPrivateBlockArgs());
2237-
}
22382232

22392233
void setLowerBound(mlir::Value bound) { (*this)->setOperand(0, bound); }
22402234
void setUpperBound(mlir::Value bound) { (*this)->setOperand(1, bound); }
22412235
void setStep(mlir::Value step) { (*this)->setOperand(2, step); }
22422236

22432237
/// Number of region arguments for loop-carried values
22442238
unsigned getNumRegionIterArgs() {
2245-
return getBody()->getNumArguments() - 1;
2239+
return getNumIterOperands();
22462240
}
22472241
/// Number of operands controlling the loop: lb, ub, step
22482242
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)