Skip to content

Commit f41c39e

Browse files
committed
[Flang][OpenMP] Lowering Order clause to MLIR
1 parent 89d8df1 commit f41c39e

File tree

4 files changed

+93
-5
lines changed

4 files changed

+93
-5
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,29 @@ bool ClauseProcessor::processNumThreads(
394394
return false;
395395
}
396396

397+
bool ClauseProcessor::processOrder(mlir::omp::OrderClauseOps &result) const {
398+
if (auto *clause = findUniqueClause<omp::clause::Order>()) {
399+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
400+
result.orderAttr = mlir::omp::ClauseOrderKindAttr::get(
401+
firOpBuilder.getContext(), mlir::omp::ClauseOrderKind::Concurrent);
402+
using Order = omp::clause::Order;
403+
const auto &modifier =
404+
std::get<std::optional<Order::OrderModifier>>(clause->t);
405+
if (modifier &&
406+
*modifier == omp::clause::Order::OrderModifier::Unconstrained) {
407+
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
408+
firOpBuilder.getContext(), mlir::omp::OrderModifier::unconstrained);
409+
} else {
410+
// "If order-modifier is not unconstrained, the behavior is as if the
411+
// reproducible modifier is present."
412+
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
413+
firOpBuilder.getContext(), mlir::omp::OrderModifier::reproducible);
414+
}
415+
return true;
416+
}
417+
return false;
418+
}
419+
397420
bool ClauseProcessor::processOrdered(
398421
mlir::omp::OrderedClauseOps &result) const {
399422
if (auto *clause = findUniqueClause<omp::clause::Ordered>()) {

flang/lib/Lower/OpenMP/ClauseProcessor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class ClauseProcessor {
7777
mlir::omp::NumTeamsClauseOps &result) const;
7878
bool processNumThreads(lower::StatementContext &stmtCtx,
7979
mlir::omp::NumThreadsClauseOps &result) const;
80+
bool processOrder(mlir::omp::OrderClauseOps &result) const;
8081
bool processOrdered(mlir::omp::OrderedClauseOps &result) const;
8182
bool processPriority(lower::StatementContext &stmtCtx,
8283
mlir::omp::PriorityClauseOps &result) const;

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,13 +1109,14 @@ static void genSimdClauses(lower::AbstractConverter &converter,
11091109
ClauseProcessor cp(converter, semaCtx, clauses);
11101110
cp.processAligned(clauseOps);
11111111
cp.processIf(llvm::omp::Directive::OMPD_simd, clauseOps);
1112+
cp.processOrder(clauseOps);
11121113
cp.processReduction(loc, clauseOps);
11131114
cp.processSafelen(clauseOps);
11141115
cp.processSimdlen(clauseOps);
11151116

11161117
// TODO Support delayed privatization.
1117-
cp.processTODO<clause::Allocate, clause::Linear, clause::Nontemporal,
1118-
clause::Order>(loc, llvm::omp::Directive::OMPD_simd);
1118+
cp.processTODO<clause::Allocate, clause::Linear, clause::Nontemporal>(
1119+
loc, llvm::omp::Directive::OMPD_simd);
11191120
}
11201121

11211122
static void genSingleClauses(lower::AbstractConverter &converter,
@@ -1280,12 +1281,13 @@ static void genWsloopClauses(
12801281
llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSyms) {
12811282
ClauseProcessor cp(converter, semaCtx, clauses);
12821283
cp.processNowait(clauseOps);
1284+
cp.processOrder(clauseOps);
12831285
cp.processOrdered(clauseOps);
12841286
cp.processReduction(loc, clauseOps, &reductionTypes, &reductionSyms);
12851287
cp.processSchedule(stmtCtx, clauseOps);
12861288
// TODO Support delayed privatization.
12871289

1288-
cp.processTODO<clause::Allocate, clause::Linear, clause::Order>(
1290+
cp.processTODO<clause::Allocate, clause::Linear>(
12891291
loc, llvm::omp::Directive::OMPD_do);
12901292
}
12911293

@@ -2023,8 +2025,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20232025
ConstructQueue::iterator item) {
20242026
ClauseProcessor cp(converter, semaCtx, item->clauses);
20252027
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
2026-
clause::Order, clause::Safelen, clause::Simdlen>(
2027-
loc, llvm::omp::OMPD_do_simd);
2028+
clause::Safelen, clause::Simdlen>(loc,
2029+
llvm::omp::OMPD_do_simd);
20282030
// TODO: Add support for vectorization - add vectorization hints inside loop
20292031
// body.
20302032
// OpenMP standard does not specify the length of vector instructions.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
! This test checks lowering of OpenMP order clause.
2+
3+
!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s
4+
5+
!CHECK-LABEL: func.func @_QPsimd_order() {
6+
subroutine simd_order
7+
!CHECK: omp.simd order(reproducible:concurrent) {
8+
!$omp simd order(concurrent)
9+
do i = 1, 10
10+
end do
11+
!CHECK: omp.simd order(reproducible:concurrent) {
12+
!$omp simd order(reproducible:concurrent)
13+
do i = 1, 10
14+
end do
15+
!CHECK: omp.simd order(unconstrained:concurrent) {
16+
!$omp simd order(unconstrained:concurrent)
17+
do i = 1, 10
18+
end do
19+
end subroutine simd_order
20+
21+
!CHECK-LABEL: func.func @_QPdo_order() {
22+
subroutine do_order
23+
!CHECK: omp.wsloop order(reproducible:concurrent) {
24+
!$omp do order(concurrent)
25+
do i = 1, 10
26+
end do
27+
!CHECK: omp.wsloop order(reproducible:concurrent) {
28+
!$omp do order(reproducible:concurrent)
29+
do i = 1, 10
30+
end do
31+
!CHECK: omp.wsloop order(unconstrained:concurrent) {
32+
!$omp do order(unconstrained:concurrent)
33+
do i = 1, 10
34+
end do
35+
end subroutine do_order
36+
37+
!CHECK-LABEL: func.func @_QPdo_simd_order() {
38+
subroutine do_simd_order
39+
!CHECK: omp.wsloop order(reproducible:concurrent) {
40+
!$omp do simd order(concurrent)
41+
do i = 1, 10
42+
end do
43+
!CHECK: omp.wsloop order(reproducible:concurrent) {
44+
!$omp do simd order(reproducible:concurrent)
45+
do i = 1, 10
46+
end do
47+
!CHECK: omp.wsloop order(unconstrained:concurrent) {
48+
!$omp do simd order(unconstrained:concurrent)
49+
do i = 1, 10
50+
end do
51+
end subroutine do_simd_order
52+
53+
!CHECK-LABEL: func.func @_QPdo_simd_order_parallel() {
54+
subroutine do_simd_order_parallel
55+
!CHECK: omp.parallel {
56+
!CHECK: omp.wsloop order(reproducible:concurrent) {
57+
!$omp parallel
58+
!$omp do simd order(reproducible:concurrent)
59+
do i = 1, 10
60+
end do
61+
!$omp end parallel
62+
end subroutine do_simd_order_parallel

0 commit comments

Comments
 (0)