Skip to content

Commit cf95339

Browse files
committed
[flang][OpenMP] Delayed privatization MLIR lowering support for distribute
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 677177b commit cf95339

File tree

3 files changed

+65
-17
lines changed

3 files changed

+65
-17
lines changed

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 18 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,35 @@ 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+
mlir::omp::PrivateClauseOps privateClauseOps;
1942+
dsp.processStep1(&privateClauseOps);
1943+
llvm::SmallVector<mlir::Type> privateVarTypes{};
1944+
1945+
for (mlir::Value privateVar : privateClauseOps.privateVars)
1946+
privateVarTypes.push_back(privateVar.getType());
19441947

19451948
mlir::omp::LoopNestOperands loopNestClauseOps;
19461949
llvm::SmallVector<const semantics::Symbol *> iv;
19471950
genLoopNestClauses(converter, semaCtx, eval, item->clauses, loc,
19481951
loopNestClauseOps, iv);
19491952

1950-
// TODO: Populate entry block arguments with private variables.
19511953
auto distributeOp = genWrapperOp<mlir::omp::DistributeOp>(
1952-
converter, loc, distributeClauseOps, /*blockArgTypes=*/{});
1954+
converter, loc, distributeClauseOps, privateVarTypes);
1955+
distributeOp.setPrivateSymsAttr(
1956+
privateClauseOps.privateSyms.empty()
1957+
? nullptr
1958+
: converter.getFirOpBuilder().getArrayAttr(
1959+
privateClauseOps.privateSyms));
1960+
1961+
for (mlir::Value privateVar : privateClauseOps.privateVars)
1962+
distributeOp.getPrivateVarsMutable().append(privateVar);
19531963

19541964
genLoopNestOp(converter, symTable, semaCtx, eval, loc, queue, item,
1955-
loopNestClauseOps, iv,
1956-
/*wrapperSyms=*/{}, distributeOp.getRegion().getArguments(),
1965+
loopNestClauseOps, iv, dsp.getDelayedPrivSymbols(),
1966+
distributeOp.getRegion().getArguments(),
19571967
llvm::omp::Directive::OMPD_distribute, dsp);
19581968
}
19591969

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: 5 additions & 9 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 =

0 commit comments

Comments
 (0)