[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