Skip to content

Commit 7ff7b4b

Browse files
committed
Add private clause to paralle op's definition.
1 parent 8fef2e4 commit 7ff7b4b

File tree

5 files changed

+131
-5
lines changed

5 files changed

+131
-5
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2572,11 +2572,12 @@ genParallelOp(Fortran::lower::AbstractConverter &converter,
25722572
/*resultTypes=*/mlir::TypeRange(), ifClauseOperand,
25732573
numThreadsClauseOperand, allocateOperands, allocatorOperands,
25742574
reductionVars,
2575+
/*private_vars=*/mlir::ValueRange(),
25752576
reductionDeclSymbols.empty()
25762577
? nullptr
25772578
: mlir::ArrayAttr::get(converter.getFirOpBuilder().getContext(),
25782579
reductionDeclSymbols),
2579-
procBindKindAttr);
2580+
procBindKindAttr, /*private_inits*/ nullptr);
25802581
}
25812582

25822583
static mlir::omp::SectionOp

mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,10 @@ def ParallelOp : OpenMP_Op<"parallel", [
188188
Variadic<AnyType>:$allocate_vars,
189189
Variadic<AnyType>:$allocators_vars,
190190
Variadic<OpenMP_PointerLikeType>:$reduction_vars,
191+
Variadic<AnyType>:$private_vars,
191192
OptionalAttr<SymbolRefArrayAttr>:$reductions,
192-
OptionalAttr<ProcBindKindAttr>:$proc_bind_val);
193+
OptionalAttr<ProcBindKindAttr>:$proc_bind_val,
194+
OptionalAttr<SymbolRefArrayAttr>:$private_inits);
193195

194196
let regions = (region AnyRegion:$region);
195197

@@ -213,6 +215,10 @@ def ParallelOp : OpenMP_Op<"parallel", [
213215
$allocators_vars, type($allocators_vars)
214216
) `)`
215217
| `proc_bind` `(` custom<ClauseAttr>($proc_bind_val) `)`
218+
| `private` `(`
219+
custom<PrivateVarList>(
220+
$private_vars, type($private_vars), $private_inits
221+
) `)`
216222
) $region attr-dict
217223
}];
218224
let hasVerifier = 1;

mlir/lib/Conversion/SCFToOpenMP/SCFToOpenMP.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,8 +419,10 @@ struct ParallelOpLowering : public OpRewritePattern<scf::ParallelOp> {
419419
/* allocate_vars = */ llvm::SmallVector<Value>{},
420420
/* allocators_vars = */ llvm::SmallVector<Value>{},
421421
/* reduction_vars = */ llvm::SmallVector<Value>{},
422+
/*private_vars=*/mlir::ValueRange{},
422423
/* reductions = */ ArrayAttr{},
423-
/* proc_bind_val = */ omp::ClauseProcBindKindAttr{});
424+
/* proc_bind_val = */ omp::ClauseProcBindKindAttr{},
425+
/*private_inits*/ nullptr);
424426
{
425427

426428
OpBuilder::InsertionGuard guard(rewriter);

mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,8 +989,9 @@ void ParallelOp::build(OpBuilder &builder, OperationState &state,
989989
ParallelOp::build(
990990
builder, state, /*if_expr_var=*/nullptr, /*num_threads_var=*/nullptr,
991991
/*allocate_vars=*/ValueRange(), /*allocators_vars=*/ValueRange(),
992-
/*reduction_vars=*/ValueRange(), /*reductions=*/nullptr,
993-
/*proc_bind_val=*/nullptr);
992+
/*reduction_vars=*/ValueRange(), /*private_vars=*/ValueRange(),
993+
/*reductions=*/nullptr,
994+
/*proc_bind_val=*/nullptr, /*private_inits*/ nullptr);
994995
state.addAttributes(attributes);
995996
}
996997

@@ -1607,6 +1608,84 @@ void PrivateClauseOp::build(OpBuilder &odsBuilder, OperationState &odsState,
16071608
SmallVector<Location>(1, odsState.location));
16081609
}
16091610

1611+
static ParseResult parsePrivateVarList(
1612+
OpAsmParser &parser,
1613+
llvm::SmallVector<OpAsmParser::UnresolvedOperand, 4> &privateVarsOperands,
1614+
llvm::SmallVector<Type, 1> &privateVarsTypes, ArrayAttr &privateInitsAttr) {
1615+
SymbolRefAttr privatizerSym;
1616+
OpAsmParser::UnresolvedOperand arg;
1617+
OpAsmParser::UnresolvedOperand blockArg;
1618+
Type argType;
1619+
1620+
SmallVector<SymbolRefAttr> privateInitsVec;
1621+
1622+
auto parsePrivatizers = [&]() -> ParseResult {
1623+
if (parser.parseAttribute(privatizerSym) || parser.parseOperand(arg) ||
1624+
parser.parseArrow() || parser.parseOperand(blockArg)) {
1625+
return failure();
1626+
}
1627+
1628+
privateInitsVec.push_back(privatizerSym);
1629+
privateVarsOperands.push_back(arg);
1630+
return success();
1631+
};
1632+
1633+
auto parseTypes = [&]() -> ParseResult {
1634+
if (parser.parseType(argType))
1635+
return failure();
1636+
privateVarsTypes.push_back(argType);
1637+
return success();
1638+
};
1639+
1640+
if (parser.parseCommaSeparatedList(parsePrivatizers))
1641+
return failure();
1642+
1643+
SmallVector<Attribute> privateInits(privateInitsVec.begin(),
1644+
privateInitsVec.end());
1645+
privateInitsAttr = ArrayAttr::get(parser.getContext(), privateInits);
1646+
1647+
if (parser.parseColon())
1648+
return failure();
1649+
1650+
if (parser.parseCommaSeparatedList(parseTypes))
1651+
return failure();
1652+
1653+
return success();
1654+
}
1655+
1656+
static void printPrivateVarList(OpAsmPrinter &printer, Operation *op,
1657+
OperandRange privateVars,
1658+
TypeRange privateVarTypes,
1659+
std::optional<ArrayAttr> privateInitsAttr) {
1660+
auto &region = op->getRegion(0);
1661+
unsigned argIndex = 0;
1662+
assert(privateVars.size() == privateVarTypes.size() &&
1663+
((privateVars.empty()) ||
1664+
(*privateInitsAttr &&
1665+
(privateInitsAttr->size() == privateVars.size()))));
1666+
1667+
for (const auto &privateVar : privateVars) {
1668+
assert(privateInitsAttr);
1669+
const auto &blockArg = region.front().getArgument(argIndex);
1670+
const auto &privateInitSym = (*privateInitsAttr)[argIndex];
1671+
printer << privateInitSym << " " << privateVar << " -> " << blockArg;
1672+
1673+
argIndex++;
1674+
if (argIndex < privateVars.size())
1675+
printer << ", ";
1676+
}
1677+
1678+
printer << " : ";
1679+
1680+
argIndex = 0;
1681+
for (const auto &mapType : privateVarTypes) {
1682+
printer << mapType;
1683+
argIndex++;
1684+
if (argIndex < privateVarTypes.size())
1685+
printer << ", ";
1686+
}
1687+
}
1688+
16101689
#define GET_ATTRDEF_CLASSES
16111690
#include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.cpp.inc"
16121691

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// RUN: fir-opt -verify-diagnostics %s | fir-opt | FileCheck %s
2+
3+
// CHECK-LABEL: _QPprivate_clause
4+
func.func @_QPprivate_clause() {
5+
%0 = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFprivate_clause_allocatableEx"}
6+
%1 = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFprivate_clause_allocatableEy"}
7+
8+
// CHECK: omp.parallel private(@x.privatizer %0 -> %arg0, @y.privatizer %1 -> %arg1 : !fir.ref<i32>, !fir.ref<i32>)
9+
omp.parallel private(@x.privatizer %0 -> %arg0, @y.privatizer %1 -> %arg1 : !fir.ref<i32>, !fir.ref<i32>) {
10+
// CHECK: bb0(%arg0: {{.*}}, %arg1: {{.*}}):
11+
^bb0(%arg0 : !fir.ref<i32>, %arg1 : !fir.ref<i32>):
12+
omp.terminator
13+
}
14+
return
15+
}
16+
17+
// CHECK: "omp.private"() <{function_type = (!fir.ref<i32>) -> !fir.ref<i32>, sym_name = "x.privatizer"}> ({
18+
"omp.private"() <{function_type = (!fir.ref<i32>) -> !fir.ref<i32>, sym_name = "x.privatizer"}> ({
19+
// CHECK: ^bb0(%arg0: {{.*}}):
20+
^bb0(%arg0: !fir.ref<i32>):
21+
22+
// CHECK: %0 = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFprivate_clause_allocatableEx"}
23+
%0 = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFprivate_clause_allocatableEx"}
24+
25+
// CHECK: omp.yield(%0 : !fir.ref<i32>)
26+
omp.yield(%0 : !fir.ref<i32>)
27+
}) : () -> ()
28+
29+
// CHECK: "omp.private"() <{function_type = (!fir.ref<i32>) -> !fir.ref<i32>, sym_name = "y.privatizer"}> ({
30+
"omp.private"() <{function_type = (!fir.ref<i32>) -> !fir.ref<i32>, sym_name = "y.privatizer"}> ({
31+
^bb0(%arg0: !fir.ref<i32>):
32+
33+
// CHECK: %0 = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFprivate_clause_allocatableEy"}
34+
%0 = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFprivate_clause_allocatableEy"}
35+
36+
// CHECK: omp.yield(%0 : !fir.ref<i32>)
37+
omp.yield(%0 : !fir.ref<i32>)
38+
}) : () -> ()

0 commit comments

Comments
 (0)