Skip to content

Commit b4ab52c

Browse files
authored
[Flang][OpenMP] Lowering Order clause to MLIR (#96730)
1 parent 4026b26 commit b4ab52c

File tree

6 files changed

+111
-7
lines changed

6 files changed

+111
-7
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

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

397+
bool ClauseProcessor::processOrder(mlir::omp::OrderClauseOps &result) const {
398+
using Order = omp::clause::Order;
399+
if (auto *clause = findUniqueClause<Order>()) {
400+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
401+
result.orderAttr = mlir::omp::ClauseOrderKindAttr::get(
402+
firOpBuilder.getContext(), mlir::omp::ClauseOrderKind::Concurrent);
403+
const auto &modifier =
404+
std::get<std::optional<Order::OrderModifier>>(clause->t);
405+
if (modifier && *modifier == Order::OrderModifier::Unconstrained) {
406+
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
407+
firOpBuilder.getContext(), mlir::omp::OrderModifier::unconstrained);
408+
} else {
409+
// "If order-modifier is not unconstrained, the behavior is as if the
410+
// reproducible modifier is present."
411+
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
412+
firOpBuilder.getContext(), mlir::omp::OrderModifier::reproducible);
413+
}
414+
return true;
415+
}
416+
return false;
417+
}
418+
397419
bool ClauseProcessor::processOrdered(
398420
mlir::omp::OrderedClauseOps &result) const {
399421
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: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,7 @@ static void genDistributeClauses(lower::AbstractConverter &converter,
10371037
ClauseProcessor cp(converter, semaCtx, clauses);
10381038
cp.processAllocate(clauseOps);
10391039
cp.processDistSchedule(stmtCtx, clauseOps);
1040+
cp.processOrder(clauseOps);
10401041
// TODO Support delayed privatization.
10411042
}
10421043

@@ -1109,13 +1110,14 @@ static void genSimdClauses(lower::AbstractConverter &converter,
11091110
ClauseProcessor cp(converter, semaCtx, clauses);
11101111
cp.processAligned(clauseOps);
11111112
cp.processIf(llvm::omp::Directive::OMPD_simd, clauseOps);
1113+
cp.processOrder(clauseOps);
11121114
cp.processReduction(loc, clauseOps);
11131115
cp.processSafelen(clauseOps);
11141116
cp.processSimdlen(clauseOps);
11151117

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

11211123
static void genSingleClauses(lower::AbstractConverter &converter,
@@ -1280,12 +1282,13 @@ static void genWsloopClauses(
12801282
llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSyms) {
12811283
ClauseProcessor cp(converter, semaCtx, clauses);
12821284
cp.processNowait(clauseOps);
1285+
cp.processOrder(clauseOps);
12831286
cp.processOrdered(clauseOps);
12841287
cp.processReduction(loc, clauseOps, &reductionTypes, &reductionSyms);
12851288
cp.processSchedule(stmtCtx, clauseOps);
12861289
// TODO Support delayed privatization.
12871290

1288-
cp.processTODO<clause::Allocate, clause::Linear, clause::Order>(
1291+
cp.processTODO<clause::Allocate, clause::Linear>(
12891292
loc, llvm::omp::Directive::OMPD_do);
12901293
}
12911294

@@ -2023,8 +2026,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
20232026
ConstructQueue::iterator item) {
20242027
ClauseProcessor cp(converter, semaCtx, item->clauses);
20252028
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
2026-
clause::Order, clause::Safelen, clause::Simdlen>(
2027-
loc, llvm::omp::OMPD_do_simd);
2029+
clause::Safelen, clause::Simdlen>(loc,
2030+
llvm::omp::OMPD_do_simd);
20282031
// TODO: Add support for vectorization - add vectorization hints inside loop
20292032
// body.
20302033
// OpenMP standard does not specify the length of vector instructions.
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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 do simd order(reproducible:concurrent)
58+
do i = 1, 10
59+
end do
60+
end subroutine do_simd_order_parallel
61+
62+
63+
subroutine distribute_order
64+
!CHECK: omp.distribute order(reproducible:concurrent) {
65+
!$omp teams distribute order(concurrent)
66+
do i=1,10
67+
end do
68+
!CHECK: omp.distribute order(reproducible:concurrent) {
69+
!$omp teams distribute order(reproducible:concurrent)
70+
do i=1,10
71+
end do
72+
!CHECK: omp.distribute order(unconstrained:concurrent) {
73+
!$omp teams distribute order(unconstrained:concurrent)
74+
do i = 1, 10
75+
end do
76+
end subroutine

llvm/include/llvm/Frontend/OpenMP/OMP.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,7 @@ def OMP_Distribute : Directive<"distribute"> {
665665
let allowedOnceClauses = [
666666
VersionedClause<OMPC_Collapse>,
667667
VersionedClause<OMPC_DistSchedule>,
668+
VersionedClause<OMPC_Order, 50>,
668669
];
669670
let association = AS_Loop;
670671
let category = CA_Executable;
@@ -2057,6 +2058,7 @@ def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
20572058
VersionedClause<OMPC_NoWait>,
20582059
VersionedClause<OMPC_NumTeams>,
20592060
VersionedClause<OMPC_OMPX_DynCGroupMem>,
2061+
VersionedClause<OMPC_Order, 50>,
20602062
VersionedClause<OMPC_ThreadLimit>,
20612063
];
20622064
let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute];
@@ -2330,6 +2332,7 @@ def OMP_TeamsDistribute : Directive<"teams distribute"> {
23302332
];
23312333
let allowedOnceClauses = [
23322334
VersionedClause<OMPC_If>,
2335+
VersionedClause<OMPC_Order, 50>,
23332336
];
23342337
let leafConstructs = [OMP_Teams, OMP_Distribute];
23352338
let category = CA_Executable;

llvm/unittests/Frontend/OpenMPDecompositionTest.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -688,8 +688,7 @@ TEST_F(OpenMPDecompositionTest, Order1) {
688688
std::string Dir5 = stringify(Dec.output[5]);
689689
ASSERT_EQ(Dir0, "target"); // (31)
690690
ASSERT_EQ(Dir1, "teams"); // (31)
691-
// XXX OMP.td doesn't list "order" as allowed for "distribute"
692-
ASSERT_EQ(Dir2, "distribute"); // (31)
691+
ASSERT_EQ(Dir2, "distribute order(1, 0)"); // (31)
693692
ASSERT_EQ(Dir3, "parallel"); // (31)
694693
ASSERT_EQ(Dir4, "for order(1, 0)"); // (31)
695694
ASSERT_EQ(Dir5, "simd order(1, 0)"); // (31)

0 commit comments

Comments
 (0)