Skip to content

[Flang][OpenMP] Lowering Order clause to MLIR #96730

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions flang/lib/Lower/OpenMP/ClauseProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,28 @@ bool ClauseProcessor::processNumThreads(
return false;
}

bool ClauseProcessor::processOrder(mlir::omp::OrderClauseOps &result) const {
using Order = omp::clause::Order;
if (auto *clause = findUniqueClause<Order>()) {
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
result.orderAttr = mlir::omp::ClauseOrderKindAttr::get(
firOpBuilder.getContext(), mlir::omp::ClauseOrderKind::Concurrent);
const auto &modifier =
std::get<std::optional<Order::OrderModifier>>(clause->t);
if (modifier && *modifier == Order::OrderModifier::Unconstrained) {
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
firOpBuilder.getContext(), mlir::omp::OrderModifier::unconstrained);
} else {
// "If order-modifier is not unconstrained, the behavior is as if the
// reproducible modifier is present."
result.orderModAttr = mlir::omp::OrderModifierAttr::get(
firOpBuilder.getContext(), mlir::omp::OrderModifier::reproducible);
}
return true;
}
return false;
}

bool ClauseProcessor::processOrdered(
mlir::omp::OrderedClauseOps &result) const {
if (auto *clause = findUniqueClause<omp::clause::Ordered>()) {
Expand Down
1 change: 1 addition & 0 deletions flang/lib/Lower/OpenMP/ClauseProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class ClauseProcessor {
mlir::omp::NumTeamsClauseOps &result) const;
bool processNumThreads(lower::StatementContext &stmtCtx,
mlir::omp::NumThreadsClauseOps &result) const;
bool processOrder(mlir::omp::OrderClauseOps &result) const;
bool processOrdered(mlir::omp::OrderedClauseOps &result) const;
bool processPriority(lower::StatementContext &stmtCtx,
mlir::omp::PriorityClauseOps &result) const;
Expand Down
13 changes: 8 additions & 5 deletions flang/lib/Lower/OpenMP/OpenMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,7 @@ static void genDistributeClauses(lower::AbstractConverter &converter,
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processAllocate(clauseOps);
cp.processDistSchedule(stmtCtx, clauseOps);
cp.processOrder(clauseOps);
// TODO Support delayed privatization.
}

Expand Down Expand Up @@ -1109,13 +1110,14 @@ static void genSimdClauses(lower::AbstractConverter &converter,
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processAligned(clauseOps);
cp.processIf(llvm::omp::Directive::OMPD_simd, clauseOps);
cp.processOrder(clauseOps);
cp.processReduction(loc, clauseOps);
cp.processSafelen(clauseOps);
cp.processSimdlen(clauseOps);

// TODO Support delayed privatization.
cp.processTODO<clause::Allocate, clause::Linear, clause::Nontemporal,
clause::Order>(loc, llvm::omp::Directive::OMPD_simd);
cp.processTODO<clause::Allocate, clause::Linear, clause::Nontemporal>(
loc, llvm::omp::Directive::OMPD_simd);
}

static void genSingleClauses(lower::AbstractConverter &converter,
Expand Down Expand Up @@ -1280,12 +1282,13 @@ static void genWsloopClauses(
llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSyms) {
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processNowait(clauseOps);
cp.processOrder(clauseOps);
cp.processOrdered(clauseOps);
cp.processReduction(loc, clauseOps, &reductionTypes, &reductionSyms);
cp.processSchedule(stmtCtx, clauseOps);
// TODO Support delayed privatization.

cp.processTODO<clause::Allocate, clause::Linear, clause::Order>(
cp.processTODO<clause::Allocate, clause::Linear>(
loc, llvm::omp::Directive::OMPD_do);
}

Expand Down Expand Up @@ -2023,8 +2026,8 @@ static void genCompositeDoSimd(lower::AbstractConverter &converter,
ConstructQueue::iterator item) {
ClauseProcessor cp(converter, semaCtx, item->clauses);
cp.processTODO<clause::Aligned, clause::Allocate, clause::Linear,
clause::Order, clause::Safelen, clause::Simdlen>(
loc, llvm::omp::OMPD_do_simd);
clause::Safelen, clause::Simdlen>(loc,
llvm::omp::OMPD_do_simd);
// TODO: Add support for vectorization - add vectorization hints inside loop
// body.
// OpenMP standard does not specify the length of vector instructions.
Expand Down
76 changes: 76 additions & 0 deletions flang/test/Lower/OpenMP/order-clause.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
! This test checks lowering of OpenMP order clause.

!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s

!CHECK-LABEL: func.func @_QPsimd_order() {
subroutine simd_order
!CHECK: omp.simd order(reproducible:concurrent) {
!$omp simd order(concurrent)
do i = 1, 10
end do
!CHECK: omp.simd order(reproducible:concurrent) {
!$omp simd order(reproducible:concurrent)
do i = 1, 10
end do
!CHECK: omp.simd order(unconstrained:concurrent) {
!$omp simd order(unconstrained:concurrent)
do i = 1, 10
end do
end subroutine simd_order

!CHECK-LABEL: func.func @_QPdo_order() {
subroutine do_order
!CHECK: omp.wsloop order(reproducible:concurrent) {
!$omp do order(concurrent)
do i = 1, 10
end do
!CHECK: omp.wsloop order(reproducible:concurrent) {
!$omp do order(reproducible:concurrent)
do i = 1, 10
end do
!CHECK: omp.wsloop order(unconstrained:concurrent) {
!$omp do order(unconstrained:concurrent)
do i = 1, 10
end do
end subroutine do_order

!CHECK-LABEL: func.func @_QPdo_simd_order() {
subroutine do_simd_order
!CHECK: omp.wsloop order(reproducible:concurrent) {
!$omp do simd order(concurrent)
do i = 1, 10
end do
!CHECK: omp.wsloop order(reproducible:concurrent) {
!$omp do simd order(reproducible:concurrent)
do i = 1, 10
end do
!CHECK: omp.wsloop order(unconstrained:concurrent) {
!$omp do simd order(unconstrained:concurrent)
do i = 1, 10
end do
end subroutine do_simd_order

!CHECK-LABEL: func.func @_QPdo_simd_order_parallel() {
subroutine do_simd_order_parallel
!CHECK: omp.parallel {
!CHECK: omp.wsloop order(reproducible:concurrent) {
!$omp parallel do simd order(reproducible:concurrent)
do i = 1, 10
end do
end subroutine do_simd_order_parallel


subroutine distribute_order
!CHECK: omp.distribute order(reproducible:concurrent) {
!$omp teams distribute order(concurrent)
do i=1,10
end do
!CHECK: omp.distribute order(reproducible:concurrent) {
!$omp teams distribute order(reproducible:concurrent)
do i=1,10
end do
!CHECK: omp.distribute order(unconstrained:concurrent) {
!$omp teams distribute order(unconstrained:concurrent)
do i = 1, 10
end do
end subroutine
3 changes: 3 additions & 0 deletions llvm/include/llvm/Frontend/OpenMP/OMP.td
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,7 @@ def OMP_Distribute : Directive<"distribute"> {
let allowedOnceClauses = [
VersionedClause<OMPC_Collapse>,
VersionedClause<OMPC_DistSchedule>,
VersionedClause<OMPC_Order, 50>,
];
let association = AS_Loop;
let category = CA_Executable;
Expand Down Expand Up @@ -2057,6 +2058,7 @@ def OMP_TargetTeamsDistribute : Directive<"target teams distribute"> {
VersionedClause<OMPC_NoWait>,
VersionedClause<OMPC_NumTeams>,
VersionedClause<OMPC_OMPX_DynCGroupMem>,
VersionedClause<OMPC_Order, 50>,
VersionedClause<OMPC_ThreadLimit>,
];
let leafConstructs = [OMP_Target, OMP_Teams, OMP_Distribute];
Expand Down Expand Up @@ -2330,6 +2332,7 @@ def OMP_TeamsDistribute : Directive<"teams distribute"> {
];
let allowedOnceClauses = [
VersionedClause<OMPC_If>,
VersionedClause<OMPC_Order, 50>,
];
let leafConstructs = [OMP_Teams, OMP_Distribute];
let category = CA_Executable;
Expand Down
3 changes: 1 addition & 2 deletions llvm/unittests/Frontend/OpenMPDecompositionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -688,8 +688,7 @@ TEST_F(OpenMPDecompositionTest, Order1) {
std::string Dir5 = stringify(Dec.output[5]);
ASSERT_EQ(Dir0, "target"); // (31)
ASSERT_EQ(Dir1, "teams"); // (31)
// XXX OMP.td doesn't list "order" as allowed for "distribute"
ASSERT_EQ(Dir2, "distribute"); // (31)
ASSERT_EQ(Dir2, "distribute order(1, 0)"); // (31)
ASSERT_EQ(Dir3, "parallel"); // (31)
ASSERT_EQ(Dir4, "for order(1, 0)"); // (31)
ASSERT_EQ(Dir5, "simd order(1, 0)"); // (31)
Expand Down
Loading