Skip to content

Commit 497523b

Browse files
authored
[flang][OpenMP] Delayed privatization MLIR lowering support for distribute (#109632)
Starts delayed privatizaiton support for standalone `distribute` directives. Other flavours of `distribute` are still TODO as well as MLIR to LLVM IR lowering.
1 parent 2ad435f commit 497523b

File tree

3 files changed

+61
-22
lines changed

3 files changed

+61
-22
lines changed

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,7 +1681,6 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
16811681
mapTypes, deviceAddrSyms, deviceAddrLocs, deviceAddrTypes,
16821682
devicePtrSyms, devicePtrLocs, devicePtrTypes);
16831683

1684-
llvm::SmallVector<const semantics::Symbol *> privateSyms;
16851684
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
16861685
/*shouldCollectPreDeterminedSymbols=*/
16871686
lower::omp::isLastItemInQueue(item, queue),
@@ -1936,24 +1935,26 @@ static void genStandaloneDistribute(lower::AbstractConverter &converter,
19361935
genDistributeClauses(converter, semaCtx, stmtCtx, item->clauses, loc,
19371936
distributeClauseOps);
19381937

1939-
// TODO: Support delayed privatization.
19401938
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
19411939
/*shouldCollectPreDeterminedSymbols=*/true,
1942-
/*useDelayedPrivatization=*/false, &symTable);
1943-
dsp.processStep1();
1940+
enableDelayedPrivatizationStaging, &symTable);
1941+
dsp.processStep1(&distributeClauseOps);
1942+
llvm::SmallVector<mlir::Type> privateVarTypes{};
1943+
1944+
for (mlir::Value privateVar : distributeClauseOps.privateVars)
1945+
privateVarTypes.push_back(privateVar.getType());
19441946

19451947
mlir::omp::LoopNestOperands loopNestClauseOps;
19461948
llvm::SmallVector<const semantics::Symbol *> iv;
19471949
genLoopNestClauses(converter, semaCtx, eval, item->clauses, loc,
19481950
loopNestClauseOps, iv);
19491951

1950-
// TODO: Populate entry block arguments with private variables.
19511952
auto distributeOp = genWrapperOp<mlir::omp::DistributeOp>(
1952-
converter, loc, distributeClauseOps, /*blockArgTypes=*/{});
1953+
converter, loc, distributeClauseOps, privateVarTypes);
19531954

19541955
genLoopNestOp(converter, symTable, semaCtx, eval, loc, queue, item,
1955-
loopNestClauseOps, iv,
1956-
/*wrapperSyms=*/{}, distributeOp.getRegion().getArguments(),
1956+
loopNestClauseOps, iv, dsp.getDelayedPrivSymbols(),
1957+
distributeOp.getRegion().getArguments(),
19571958
llvm::omp::Directive::OMPD_distribute, dsp);
19581959
}
19591960

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -mmlir --openmp-enable-delayed-privatization-staging \
2+
! RUN: -o - %s 2>&1 | FileCheck %s
3+
! RUN: bbc -emit-hlfir -fopenmp --openmp-enable-delayed-privatization-staging -o - %s 2>&1 \
4+
! RUN: | FileCheck %s
5+
6+
subroutine standalone_distribute
7+
implicit none
8+
integer :: simple_var, i
9+
10+
!$omp teams
11+
!$omp distribute private(simple_var)
12+
do i = 1, 10
13+
simple_var = simple_var + i
14+
end do
15+
!$omp end distribute
16+
!$omp end teams
17+
end subroutine standalone_distribute
18+
19+
! CHECK: omp.private {type = private} @[[I_PRIVATIZER_SYM:.*]] : !fir.ref<i32>
20+
! CHECK: omp.private {type = private} @[[VAR_PRIVATIZER_SYM:.*]] : !fir.ref<i32>
21+
22+
23+
! CHECK-LABEL: func.func @_QPstandalone_distribute() {
24+
! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFstandalone_distributeEi"}
25+
! CHECK: %[[VAR_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFstandalone_distributeEsimple_var"}
26+
! CHECK: omp.teams {
27+
! CHECK: omp.distribute
28+
! CHECK-SAME: private(@[[VAR_PRIVATIZER_SYM]] %[[VAR_DECL]]#0 -> %[[VAR_ARG:.*]] : !fir.ref<i32>,
29+
! CHECK-SAME: @[[I_PRIVATIZER_SYM]] %[[I_DECL]]#0 -> %[[I_ARG:.*]] : !fir.ref<i32>) {
30+
! CHECK: omp.loop_nest {{.*}} {
31+
! CHECK: %[[VAR_PRIV_DECL:.*]]:2 = hlfir.declare %[[VAR_ARG]]
32+
! CHECK: %[[I_PRIV_DECL:.*]]:2 = hlfir.declare %[[I_ARG]]
33+
34+
! CHECK: fir.store %{{.*}} to %[[I_PRIV_DECL]]#1 : !fir.ref<i32>
35+
! CHECK: %{{.*}} = fir.load %[[VAR_PRIV_DECL]]#0 : !fir.ref<i32>
36+
! CHECK: %{{.*}} = fir.load %[[I_PRIV_DECL]]#0 : !fir.ref<i32>
37+
! CHECK: arith.addi %{{.*}}, %{{.*}} : i32
38+
! CHECK: hlfir.assign %{{.*}} to %[[VAR_PRIV_DECL]]#0 : i32, !fir.ref<i32>
39+
! CHECK: }
40+
! CHECK: }
41+
! CHECK: }
42+
! CHECK: }

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,17 +1225,13 @@ parsePrivateList(OpAsmParser &parser,
12251225
}
12261226

12271227
static void printPrivateList(OpAsmPrinter &p, Operation *op,
1228-
ValueRange privateVars, TypeRange privateTypes,
1229-
ArrayAttr privateSyms) {
1230-
// TODO: Remove target-specific logic from this function.
1231-
auto targetOp = mlir::dyn_cast<mlir::omp::TargetOp>(op);
1232-
assert(targetOp);
1233-
1228+
Operation::operand_range privateVars,
1229+
TypeRange privateTypes, ArrayAttr privateSyms) {
12341230
auto &region = op->getRegion(0);
12351231
auto *argsBegin = region.front().getArguments().begin();
1236-
MutableArrayRef argsSubrange(argsBegin + targetOp.getMapVars().size(),
1237-
argsBegin + targetOp.getMapVars().size() +
1238-
privateTypes.size());
1232+
MutableArrayRef argsSubrange(argsBegin + privateVars.getBeginOperandIndex(),
1233+
argsBegin + privateVars.getBeginOperandIndex() +
1234+
privateVars.size());
12391235
mlir::SmallVector<bool> isByRefVec;
12401236
isByRefVec.resize(privateTypes.size(), false);
12411237
DenseBoolArrayAttr isByRef =
@@ -1859,11 +1855,11 @@ LogicalResult SimdOp::verify() {
18591855

18601856
void DistributeOp::build(OpBuilder &builder, OperationState &state,
18611857
const DistributeOperands &clauses) {
1862-
// TODO Store clauses in op: privateVars, privateSyms.
1863-
DistributeOp::build(
1864-
builder, state, clauses.allocateVars, clauses.allocatorVars,
1865-
clauses.distScheduleStatic, clauses.distScheduleChunkSize, clauses.order,
1866-
clauses.orderMod, /*private_vars=*/{}, /*private_syms=*/nullptr);
1858+
DistributeOp::build(builder, state, clauses.allocateVars,
1859+
clauses.allocatorVars, clauses.distScheduleStatic,
1860+
clauses.distScheduleChunkSize, clauses.order,
1861+
clauses.orderMod, clauses.privateVars,
1862+
makeArrayAttr(builder.getContext(), clauses.privateSyms));
18671863
}
18681864

18691865
LogicalResult DistributeOp::verify() {

0 commit comments

Comments
 (0)