[flang-commits] [flang] [llvm] Enabling support for Allocate clause in DO construct (PR #180172)
via flang-commits
flang-commits at lists.llvm.org
Fri Feb 6 06:16:51 PST 2026
https://github.com/ShashwathiNavada updated https://github.com/llvm/llvm-project/pull/180172
>From 42d75443bb330807023a74eea3939e4c89caa762 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Fri, 6 Feb 2026 05:35:45 -0600
Subject: [PATCH 1/2] Enabling support for Allocate clause in DO construct
---
flang/lib/Lower/OpenMP/OpenMP.cpp | 3 +-
flang/test/Semantics/OpenMP/allocate_do.f90 | 46 +++++++++++++++++++++
llvm/include/llvm/Frontend/OpenMP/OMP.td | 2 +
3 files changed, 49 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/allocate_do.f90
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index df89cbe46a5c8..1d5b8b5ac436e 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1887,14 +1887,13 @@ static void genWsloopClauses(
mlir::Location loc, mlir::omp::WsloopOperands &clauseOps,
llvm::SmallVectorImpl<const semantics::Symbol *> &reductionSyms) {
ClauseProcessor cp(converter, semaCtx, clauses);
+ cp.processAllocate(clauseOps);
cp.processNowait(clauseOps);
cp.processOrder(clauseOps);
cp.processOrdered(clauseOps);
cp.processReduction(loc, clauseOps, reductionSyms);
cp.processSchedule(stmtCtx, clauseOps);
cp.processLinear(clauseOps);
-
- cp.processTODO<clause::Allocate>(loc, llvm::omp::Directive::OMPD_do);
}
//===----------------------------------------------------------------------===//
diff --git a/flang/test/Semantics/OpenMP/allocate_do.f90 b/flang/test/Semantics/OpenMP/allocate_do.f90
new file mode 100644
index 0000000000000..cf63fdaa13688
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/allocate_do.f90
@@ -0,0 +1,46 @@
+! REQUIRES: openmp_runtime
+! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
+module all_mod
+ integer, parameter :: N = 100
+ integer(kind=4), dimension(N) :: AAA
+ integer(kind=4), dimension(N) :: BBB
+ integer(kind=4), dimension(N) :: CCC
+ integer(kind=4), dimension(N) :: DDD
+ integer val, error_count
+ contains
+ subroutine initialize()
+ do i=1,N
+ AAA(i) = i
+ BBB(i) = 2*i
+ CCC(i) = 0
+ DDD(i) = 0
+ end do
+ val = 0
+ end subroutine
+end module
+
+subroutine test_omp_do()
+ use all_mod
+ !$omp parallel shared(AAA,BBB,CCC,DDD,val)
+ !$omp do private(CCC, val) allocate(0:CCC, val)
+ do i=1,N
+ CCC(i) = AAA(i) + BBB(i)
+ val = AAA(i) + BBB(i)
+ DDD(i) = CCC(i) + val
+ end do
+ !$omp end do
+ !$omp end parallel
+end subroutine test_omp_do
+
+subroutine test_omp_parallel_do()
+ use all_mod
+ !$omp parallel do private(CCC, val) allocate(0:CCC, val) shared(AAA,BBB,DDD)
+ do i=1,N
+ CCC(i) = AAA(i) + BBB(i)
+ val = AAA(i) + BBB(i)
+ DDD(i) = CCC(i) + val
+ end do
+ !$omp end parallel do
+end subroutine test_omp_parallel_do
+program test_omp_do
+end program
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index b5d262aec63d0..768636721d3d3 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -890,6 +890,7 @@ def OMP_Distribute : Directive<[Spelling<"distribute">]> {
}
def OMP_Do : Directive<[Spelling<"do">]> {
let allowedClauses = [
+ VersionedClause<OMPC_Allocate>,
VersionedClause<OMPC_FirstPrivate>,
VersionedClause<OMPC_LastPrivate>,
VersionedClause<OMPC_Linear>,
@@ -1791,6 +1792,7 @@ def OMP_MasterTaskloopSimd : Directive<[Spelling<"master taskloop simd">]> {
}
def OMP_ParallelDo : Directive<[Spelling<"parallel do">]> {
let allowedClauses = [
+ VersionedClause<OMPC_Allocate>,
VersionedClause<OMPC_Copyin>,
VersionedClause<OMPC_Default>,
VersionedClause<OMPC_FirstPrivate>,
>From 22bb516f053c2ef2c58ae39f05b22b7655ff2e24 Mon Sep 17 00:00:00 2001
From: ShashwathiNavada <shashwathinavada at gmail.com>
Date: Fri, 6 Feb 2026 08:16:29 -0600
Subject: [PATCH 2/2] Suggested changes
---
flang/test/Semantics/OpenMP/allocate_do.f90 | 3 +-
flang/test/Semantics/OpenMP/allocate_do1.f90 | 49 ++++++++++++++++++++
llvm/include/llvm/Frontend/OpenMP/OMP.td | 4 +-
3 files changed, 52 insertions(+), 4 deletions(-)
create mode 100644 flang/test/Semantics/OpenMP/allocate_do1.f90
diff --git a/flang/test/Semantics/OpenMP/allocate_do.f90 b/flang/test/Semantics/OpenMP/allocate_do.f90
index cf63fdaa13688..aad6640818414 100644
--- a/flang/test/Semantics/OpenMP/allocate_do.f90
+++ b/flang/test/Semantics/OpenMP/allocate_do.f90
@@ -1,5 +1,4 @@
-! REQUIRES: openmp_runtime
-! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=52
+! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=50
module all_mod
integer, parameter :: N = 100
integer(kind=4), dimension(N) :: AAA
diff --git a/flang/test/Semantics/OpenMP/allocate_do1.f90 b/flang/test/Semantics/OpenMP/allocate_do1.f90
new file mode 100644
index 0000000000000..14bfb4210c2e3
--- /dev/null
+++ b/flang/test/Semantics/OpenMP/allocate_do1.f90
@@ -0,0 +1,49 @@
+!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=45
+module all_mod
+ integer, parameter :: N = 100
+ integer(kind=4), dimension(N) :: AAA
+ integer(kind=4), dimension(N) :: BBB
+ integer(kind=4), dimension(N) :: CCC
+ integer(kind=4), dimension(N) :: DDD
+ integer val, error_count
+ contains
+ subroutine initialize()
+ do i=1,N
+ AAA(i) = i
+ BBB(i) = 2*i
+ CCC(i) = 0
+ DDD(i) = 0
+ end do
+ val = 0
+ end subroutine
+end module
+
+subroutine test_omp_do()
+ use all_mod
+ !$omp parallel shared(AAA,BBB,CCC,DDD,val)
+ !ERROR: ALLOCATE clause is not allowed on directive DO in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: 'allocator-simple-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=50
+ !$omp do private(CCC, val) allocate(0:CCC, val)
+ do i=1,N
+ CCC(i) = AAA(i) + BBB(i)
+ val = AAA(i) + BBB(i)
+ DDD(i) = CCC(i) + val
+ end do
+ !$omp end do
+ !$omp end parallel
+end subroutine test_omp_do
+
+subroutine test_omp_parallel_do()
+ use all_mod
+ !ERROR: ALLOCATE clause is not allowed on directive PARALLEL DO in OpenMP v4.5, try -fopenmp-version=50
+ !ERROR: 'allocator-simple-modifier' modifier is not supported in OpenMP v4.5, try -fopenmp-version=50
+ !$omp parallel do private(CCC, val) allocate(0:CCC, val) shared(AAA,BBB,DDD)
+ do i=1,N
+ CCC(i) = AAA(i) + BBB(i)
+ val = AAA(i) + BBB(i)
+ DDD(i) = CCC(i) + val
+ end do
+ !$omp end parallel do
+end subroutine test_omp_parallel_do
+program test_omp_do
+end program
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index 768636721d3d3..b30c5507ecd13 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -890,7 +890,7 @@ def OMP_Distribute : Directive<[Spelling<"distribute">]> {
}
def OMP_Do : Directive<[Spelling<"do">]> {
let allowedClauses = [
- VersionedClause<OMPC_Allocate>,
+ VersionedClause<OMPC_Allocate, 50>,
VersionedClause<OMPC_FirstPrivate>,
VersionedClause<OMPC_LastPrivate>,
VersionedClause<OMPC_Linear>,
@@ -1792,7 +1792,7 @@ def OMP_MasterTaskloopSimd : Directive<[Spelling<"master taskloop simd">]> {
}
def OMP_ParallelDo : Directive<[Spelling<"parallel do">]> {
let allowedClauses = [
- VersionedClause<OMPC_Allocate>,
+ VersionedClause<OMPC_Allocate, 50>,
VersionedClause<OMPC_Copyin>,
VersionedClause<OMPC_Default>,
VersionedClause<OMPC_FirstPrivate>,
More information about the flang-commits
mailing list