Skip to content

Commit 397edbf

Browse files
committed
[Flang][OpenMP][MLIR] Lowering of reduction,inreduction, nogroup and lastprivate clause to MLIR
1 parent cdf52a1 commit 397edbf

File tree

9 files changed

+159
-37
lines changed

9 files changed

+159
-37
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,11 @@ bool ClauseProcessor::processMergeable(
406406
return markClauseOccurrence<omp::clause::Mergeable>(result.mergeable);
407407
}
408408

409+
bool ClauseProcessor::processNogroup(
410+
mlir::omp::NogroupClauseOps &result) const {
411+
return markClauseOccurrence<omp::clause::Nogroup>(result.nogroup);
412+
}
413+
409414
bool ClauseProcessor::processNowait(mlir::omp::NowaitClauseOps &result) const {
410415
return markClauseOccurrence<omp::clause::Nowait>(result.nowait);
411416
}

flang/lib/Lower/OpenMP/ClauseProcessor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class ClauseProcessor {
8989
bool processInclusive(mlir::Location currentLocation,
9090
mlir::omp::InclusiveClauseOps &result) const;
9191
bool processMergeable(mlir::omp::MergeableClauseOps &result) const;
92+
bool processNogroup(mlir::omp::NogroupClauseOps &result) const;
9293
bool processNowait(mlir::omp::NowaitClauseOps &result) const;
9394
bool processNumTasks(lower::StatementContext &stmtCtx,
9495
mlir::omp::NumTasksClauseOps &result) const;

flang/lib/Lower/OpenMP/DataSharingProcessor.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,8 @@ void DataSharingProcessor::insertLastPrivateCompare(mlir::Operation *op) {
342342
if (!hasLastPrivate)
343343
return;
344344

345-
if (mlir::isa<mlir::omp::WsloopOp>(op) || mlir::isa<mlir::omp::SimdOp>(op)) {
345+
if (mlir::isa<mlir::omp::WsloopOp>(op) || mlir::isa<mlir::omp::SimdOp>(op) ||
346+
mlir::isa<mlir::omp::TaskloopOp>(op)) {
346347
mlir::omp::LoopRelatedClauseOps result;
347348
llvm::SmallVector<const semantics::Symbol *> iv;
348349
collectLoopRelatedInfo(converter, converter.getCurrentLocation(), eval,

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,21 +1763,24 @@ static void genTaskgroupClauses(
17631763
cp.processTaskReduction(loc, clauseOps, taskReductionSyms);
17641764
}
17651765

1766-
static void genTaskloopClauses(lower::AbstractConverter &converter,
1767-
semantics::SemanticsContext &semaCtx,
1768-
lower::StatementContext &stmtCtx,
1769-
const List<Clause> &clauses, mlir::Location loc,
1770-
mlir::omp::TaskloopOperands &clauseOps) {
1766+
static void genTaskloopClauses(
1767+
lower::AbstractConverter &converter, semantics::SemanticsContext &semaCtx,
1768+
lower::StatementContext &stmtCtx, const List<Clause> &clauses,
1769+
mlir::Location loc, mlir::omp::TaskloopOperands &clauseOps,
1770+
llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSyms,
1771+
llvm::SmallVectorImpl<const semantics::Symbol *> &inReductionSyms) {
17711772

17721773
ClauseProcessor cp(converter, semaCtx, clauses);
17731774
cp.processGrainsize(stmtCtx, clauseOps);
17741775
cp.processNumTasks(stmtCtx, clauseOps);
1776+
cp.processNogroup(clauseOps);
1777+
cp.processReduction(loc, clauseOps, reductionSyms);
1778+
cp.processInReduction(loc, clauseOps, inReductionSyms);
17751779

17761780
cp.processTODO<clause::Allocate, clause::Collapse, clause::Default,
1777-
clause::Final, clause::If, clause::InReduction,
1778-
clause::Lastprivate, clause::Mergeable, clause::Nogroup,
1779-
clause::Priority, clause::Reduction, clause::Shared,
1780-
clause::Untied>(loc, llvm::omp::Directive::OMPD_taskloop);
1781+
clause::Final, clause::If, clause::Mergeable, clause::Priority,
1782+
clause::Shared, clause::Untied>(
1783+
loc, llvm::omp::Directive::OMPD_taskloop);
17811784
}
17821785

17831786
static void genTaskwaitClauses(lower::AbstractConverter &converter,
@@ -2979,8 +2982,11 @@ static mlir::omp::TaskloopOp genStandaloneTaskloop(
29792982
lower::pft::Evaluation &eval, mlir::Location loc,
29802983
const ConstructQueue &queue, ConstructQueue::const_iterator item) {
29812984
mlir::omp::TaskloopOperands taskloopClauseOps;
2985+
llvm::SmallVector<const semantics::Symbol *> reductionSyms;
2986+
llvm::SmallVector<const semantics::Symbol *> inReductionSyms;
2987+
29822988
genTaskloopClauses(converter, semaCtx, stmtCtx, item->clauses, loc,
2983-
taskloopClauseOps);
2989+
taskloopClauseOps, reductionSyms, inReductionSyms);
29842990
DataSharingProcessor dsp(converter, semaCtx, item->clauses, eval,
29852991
/*shouldCollectPreDeterminedSymbols=*/true,
29862992
enableDelayedPrivatization, symTable);
@@ -2994,6 +3000,10 @@ static mlir::omp::TaskloopOp genStandaloneTaskloop(
29943000
EntryBlockArgs taskloopArgs;
29953001
taskloopArgs.priv.syms = dsp.getDelayedPrivSymbols();
29963002
taskloopArgs.priv.vars = taskloopClauseOps.privateVars;
3003+
taskloopArgs.reduction.syms = reductionSyms;
3004+
taskloopArgs.reduction.vars = taskloopClauseOps.reductionVars;
3005+
taskloopArgs.inReduction.syms = inReductionSyms;
3006+
taskloopArgs.inReduction.vars = taskloopClauseOps.inReductionVars;
29973007

29983008
auto taskLoopOp = genWrapperOp<mlir::omp::TaskloopOp>(
29993009
converter, loc, taskloopClauseOps, taskloopArgs);

flang/test/Lower/OpenMP/Todo/taskloop-inreduction.f90

Lines changed: 0 additions & 13 deletions
This file was deleted.

flang/test/Lower/OpenMP/Todo/taskloop-reduction.f90

Lines changed: 0 additions & 13 deletions
This file was deleted.

flang/test/Lower/OpenMP/taskloop.f90

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
22
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
33

4+
! CHECK-LABEL: omp.private
5+
! CHECK-SAME: {type = private} @[[LAST_PRIVATE_I:.*]] : i32
6+
7+
! CHECK-LABEL: omp.private
8+
! CHECK-SAME: {type = private} @[[LAST_PRIVATE_X:.*]] : i32
9+
10+
! CHECK-LABEL: omp.private
11+
! CHECK-SAME: {type = private} @[[QFOMP_TASKLOOP_NOGROUPEI_PRIVATE_I32:.*]] : i32
12+
413
! CHECK-LABEL: omp.private
514
! CHECK-SAME: {type = private} @[[I_PRIVATE_TEST2:.*]] : i32
615

@@ -70,3 +79,46 @@ subroutine omp_taskloop_private
7079
! CHECK: }
7180
!$omp end taskloop
7281
end subroutine omp_taskloop_private
82+
83+
!===============================================================================
84+
! `nogroup` clause
85+
!===============================================================================
86+
87+
subroutine omp_taskloop_nogroup()
88+
! CHECK: omp.taskloop nogroup
89+
!$omp taskloop nogroup
90+
do i = 1, 10
91+
call foo()
92+
end do
93+
!$omp end taskloop
94+
end subroutine
95+
96+
!===============================================================================
97+
! `lastprivate` clause
98+
!===============================================================================
99+
100+
! CHECK-LABEL: func.func @_QPomp_taskloop_lastprivate
101+
! CHECK: %[[ALLOCA_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomp_taskloop_lastprivateEi"}
102+
! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOCA_I]] {uniq_name = "_QFomp_taskloop_lastprivateEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
103+
! CHECK: %[[ALLOCA_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFomp_taskloop_lastprivateEx"}
104+
! CHECK: %[[DECL_X:.*]]:2 = hlfir.declare %[[ALLOCA_X]] {uniq_name = "_QFomp_taskloop_lastprivateEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
105+
subroutine omp_taskloop_lastprivate()
106+
integer x
107+
x = 0
108+
! CHECK: omp.taskloop private(@[[LAST_PRIVATE_X]] %[[DECL_X]]#0 -> %[[ARG0]], @[[LAST_PRIVATE_I]] %[[DECL_I]]#0 -> %[[ARG1]] : !fir.ref<i32>, !fir.ref<i32>) {
109+
!$omp taskloop lastprivate(x)
110+
do i = 1, 100
111+
! CHECK: %[[DECL_ARG0:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFomp_taskloop_lastprivateEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
112+
! CHECK: %[[LOAD_ARG0:.*]] = fir.load %[[DECL_ARG0]]#0 : !fir.ref<i32>
113+
! CHECK: %[[RES_ADD:.*]] = arith.addi %[[LOAD_ARG0]], %{{.*}} : i32
114+
! CHECK: hlfir.assign %[[RES_ADD]] to %[[DECL_ARG0]]#0 : i32, !fir.ref<i32>
115+
x = x + 1
116+
! CHECK: %[[SELCT_RESULT:.*]] = arith.select %{{.*}}, %{{.*}}, %{{.*}} : i1
117+
! CHECK: fir.if %[[SELCT_RESULT]] {
118+
! CHECK: %[[LOADED_SUM:.*]] = fir.load %[[DECL_ARG0]]#0 : !fir.ref<i32>
119+
! CHECK: hlfir.assign %[[LOADED_SUM]] to %[[DECL_X]]#0 : i32, !fir.ref<i32>
120+
! CHECK: }
121+
! CHECK: omp.yield
122+
end do
123+
!$omp end taskloop
124+
end subroutine omp_taskloop_lastprivate
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
2+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
3+
4+
! CHECK-LABEL: omp.private
5+
! CHECK-SAME: {type = private} @[[PRIVATE_I:.*]] : i32
6+
7+
! CHECK-LABEL: omp.declare_reduction
8+
! CHECK-SAME: @[[ADD_RED_I32:.*]] : i32 init {
9+
! CHECK: ^bb0(%{{.*}}: i32):
10+
! CHECK: %[[C0_I32:.*]] = arith.constant 0 : i32
11+
! CHECK: omp.yield(%[[C0_I32]] : i32)
12+
! CHECK: } combiner {
13+
! CHECK: ^bb0(%{{.*}}: i32, %{{.*}}: i32):
14+
! CHECK: %[[RES:.*]] = arith.addi %{{.*}}, %{{.*}} : i32
15+
! CHECK: omp.yield(%[[RES]] : i32)
16+
! CHECK: }
17+
18+
! CHECK-LABEL: func.func @_QPomp_taskloop_inreduction
19+
! CHECK: %[[ALLOCA_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomp_taskloop_inreductionEi"}
20+
! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOCA_I]] {uniq_name = "_QFomp_taskloop_inreductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
21+
! CHECK: %[[ALLOCA_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFomp_taskloop_inreductionEx"}
22+
! CHECK: %[[DECL_X:.*]]:2 = hlfir.declare %[[ALLOCA_X]] {uniq_name = "_QFomp_taskloop_inreductionEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
23+
! CHECK: %[[INIT_X:.*]] = arith.constant 0 : i32
24+
! CHECK: hlfir.assign %[[INIT_X]] to %[[DECL_X]]#0 : i32, !fir.ref<i32>
25+
subroutine omp_taskloop_inreduction()
26+
integer x
27+
x = 0
28+
! CHECK: omp.taskloop in_reduction(@[[ADD_RED_I32]]
29+
! CHECK: %[[DECL_X]]#0 -> %[[ARG0:.*]] : !fir.ref<i32>) private(@[[PRIVATE_I]] %[[DECL_I]]#0 -> %[[ARG1:.*]] : !fir.ref<i32>) {
30+
! CHECK: %[[VAL_ARG1:.*]]:2 = hlfir.declare %[[ARG0]]
31+
! CHECK-SAME: {uniq_name = "_QFomp_taskloop_inreductionEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
32+
!$omp taskloop in_reduction(+:x)
33+
do i = 1, 100
34+
! CHECK: %[[X_VAL:.*]] = fir.load %[[VAL_ARG1]]#0 : !fir.ref<i32>
35+
! CHECK: %[[ADD_VAL:.*]] = arith.addi %[[X_VAL]], %{{.*}} : i32
36+
x = x + 1
37+
! CHECK: hlfir.assign %[[ADD_VAL]] to %[[VAL_ARG1]]#0 : i32, !fir.ref<i32>
38+
end do
39+
!$omp end taskloop
40+
end subroutine omp_taskloop_inreduction
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
2+
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
3+
4+
! CHECK-LABEL: omp.private
5+
! CHECK-SAME: {type = private} @[[PRIVATE_I:.*]] : i32
6+
7+
! CHECK-LABEL: omp.declare_reduction
8+
! CHECK-SAME: @[[ADD_RED_I32:.*]] : i32 init {
9+
! CHECK: ^bb0(%{{.*}}: i32):
10+
! CHECK: %[[C0_I32:.*]] = arith.constant 0 : i32
11+
! CHECK: omp.yield(%[[C0_I32]] : i32)
12+
! CHECK: } combiner {
13+
! CHECK: ^bb0(%{{.*}}: i32, %{{.*}}: i32):
14+
! CHECK: %[[RES:.*]] = arith.addi %{{.*}}, %{{.*}} : i32
15+
! CHECK: omp.yield(%[[RES]] : i32)
16+
! CHECK: }
17+
18+
! CHECK-LABEL: func.func @_QPomp_taskloop_reduction
19+
! CHECK: %[[ALLOCA_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFomp_taskloop_reductionEi"}
20+
! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOCA_I]] {uniq_name = "_QFomp_taskloop_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
21+
! CHECK: %[[ALLOCA_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFomp_taskloop_reductionEx"}
22+
! CHECK: %[[DECL_X:.*]]:2 = hlfir.declare %[[ALLOCA_X]] {uniq_name = "_QFomp_taskloop_reductionEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
23+
! CHECK: %[[INIT_X:.*]] = arith.constant 0 : i32
24+
! CHECK: hlfir.assign %[[INIT_X]] to %[[DECL_X]]#0 : i32, !fir.ref<i32>
25+
subroutine omp_taskloop_reduction()
26+
integer x
27+
x = 0
28+
! CHECK: omp.taskloop private(@[[PRIVATE_I]]
29+
! CHECK-SAME: %[[DECL_I]]#0 -> %[[ARG0:.*]] : !fir.ref<i32>) reduction(@[[ADD_RED_I32]] %[[DECL_X]]#0 -> %[[ARG1:.*]] : !fir.ref<i32>) {
30+
! CHECK: %[[VAL_ARG1:.*]]:2 = hlfir.declare %[[ARG1]]
31+
!$omp taskloop reduction(+:x)
32+
do i = 1, 100
33+
! CHECK: %[[X_VAL:.*]] = fir.load %[[VAL_ARG1]]#0 : !fir.ref<i32>
34+
! CHECK: %[[ADD_VAL:.*]] = arith.addi %[[X_VAL]], %{{.*}} : i32
35+
x = x + 1
36+
! CHECK: hlfir.assign %[[ADD_VAL]] to %[[VAL_ARG1]]#0 : i32, !fir.ref<i32>
37+
end do
38+
!$omp end taskloop
39+
end subroutine omp_taskloop_reduction

0 commit comments

Comments
 (0)