[flang-commits] [flang] [llvm] [flang][OpenMP] Change NONTEMPORAL clause to contain OmpObjectList (PR #195331)

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Fri May 1 12:19:35 PDT 2026


https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/195331

NONTEMPORAL in source code takes a variable list, which is represented in the AST as OmpObjectList.

>From 39eff8b8747f7ccddbfadf826f00fd7f141cf4f6 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Fri, 1 May 2026 14:13:49 -0500
Subject: [PATCH] [flang][OpenMP] Change NONTEMPORAL clause to contain
 OmpObjectList

NONTEMPORAL in source code takes a variable list, which is represented
in the AST as OmpObjectList.
---
 flang/lib/Lower/OpenMP/Clauses.cpp            |  4 +-
 flang/lib/Parser/openmp-parsers.cpp           |  2 +-
 flang/lib/Semantics/check-omp-structure.cpp   |  7 ++-
 flang/lib/Semantics/resolve-directives.cpp    |  4 +-
 .../Parser/OpenMP/nontemporal-unparse.f90     | 46 +++++++++++++++++--
 llvm/include/llvm/Frontend/OpenMP/OMP.td      |  3 +-
 6 files changed, 53 insertions(+), 13 deletions(-)

diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index 92a98152c5cc6..10fd906db931b 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -1255,8 +1255,8 @@ Nocontext make(const parser::OmpClause::Nocontext &inp,
 
 Nontemporal make(const parser::OmpClause::Nontemporal &inp,
                  semantics::SemanticsContext &semaCtx) {
-  // inp.v -> std::list<parser::Name>
-  return Nontemporal{/*List=*/makeList(inp.v, makeObjectFn(semaCtx))};
+  // inp.v -> parser::OmpObjectList
+  return Nontemporal{/*List=*/makeObjects(inp.v, semaCtx)};
 }
 
 // NoOpenmp: empty
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index f8ee77a275344..d89bf13e137d8 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1568,7 +1568,7 @@ TYPE_PARSER( //
                        parenthesized(scalarLogicalExpr))) ||
     "NOGROUP" >> construct<OmpClause>(construct<OmpClause::Nogroup>()) ||
     "NONTEMPORAL" >> construct<OmpClause>(construct<OmpClause::Nontemporal>(
-                         parenthesized(nonemptyList(name)))) ||
+                         parenthesized(Parser<OmpObjectList>{}))) ||
     "NOTINBRANCH" >>
         construct<OmpClause>(construct<OmpClause::Notinbranch>()) ||
     "NOVARIANTS" >> construct<OmpClause>(construct<OmpClause::Novariants>(
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index a647d4cccfb68..e3b623e2e9f95 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -777,7 +777,12 @@ void OmpStructureChecker::CheckMultListItems() {
   for (auto [_, clause] : FindClauses(llvm::omp::Clause::OMPC_nontemporal)) {
     const auto &nontempClause{
         std::get<parser::OmpClause::Nontemporal>(clause->u)};
-    const auto &nontempNameList{nontempClause.v};
+    std::list<parser::Name> nontempNameList;
+    for (auto &ompObject : nontempClause.v.v) {
+      if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) {
+        nontempNameList.push_back(*name);
+      }
+    }
     CheckMultipleOccurrence(
         listVars, nontempNameList, clause->source, "NONTEMPORAL");
   }
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index d056917d849fd..db6f4b013c05c 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -844,8 +844,8 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor<llvm::omp::Directive> {
   }
 
   bool Pre(const parser::OmpClause::Nontemporal &x) {
-    const auto &nontemporalNameList{x.v};
-    ResolveOmpNameList(nontemporalNameList, Symbol::Flag::OmpNontemporal);
+    ResolveOmpObjectList(
+        *parser::omp::GetOmpObjectList(x), Symbol::Flag::OmpNontemporal);
     return false;
   }
 
diff --git a/flang/test/Parser/OpenMP/nontemporal-unparse.f90 b/flang/test/Parser/OpenMP/nontemporal-unparse.f90
index 236c92416ea19..a74d1d0c51865 100644
--- a/flang/test/Parser/OpenMP/nontemporal-unparse.f90
+++ b/flang/test/Parser/OpenMP/nontemporal-unparse.f90
@@ -1,4 +1,5 @@
-! RUN: %flang_fc1 -fdebug-unparse-no-sema -fopenmp %s | FileCheck %s
+!RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=50 %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s
+!RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=50 %s | FileCheck --check-prefix="PARSE-TREE" %s
 
 program omp_simd
   integer i
@@ -6,14 +7,49 @@ program omp_simd
 
   allocate(a(10))
 
-  !NONTEMPORAL
   !$omp simd nontemporal(a)
   do i = 1, 10
     a(i) = i
   end do
   !$omp end simd
 end program omp_simd
-!CHECK-LABEL: PROGRAM omp_simd
 
-!NONTEMPORAL
-!CHECK: !$OMP SIMD  NONTEMPORAL(a)
+!UNPARSE: PROGRAM OMP_SIMD
+!UNPARSE:  INTEGER i
+!UNPARSE:  INTEGER, ALLOCATABLE :: a(:)
+!UNPARSE:  ALLOCATE(a(10_4))
+!UNPARSE: !$OMP SIMD NONTEMPORAL(a)
+!UNPARSE:  DO i=1_4,10_4
+!UNPARSE:    a(int(i,kind=8))=i
+!UNPARSE:  END DO
+!UNPARSE: !$OMP END SIMD
+!UNPARSE: END PROGRAM OMP_SIMD
+
+!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct
+!PARSE-TREE: | OmpBeginDirective
+!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = simd
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Nontemporal -> OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'a'
+!PARSE-TREE: | | Flags = {}
+!PARSE-TREE: | Block
+!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct
+!PARSE-TREE: | | | NonLabelDoStmt
+!PARSE-TREE: | | | | LoopControl -> LoopBounds
+!PARSE-TREE: | | | | | Scalar -> Name = 'i'
+!PARSE-TREE: | | | | | Scalar -> Expr = '1_4'
+!PARSE-TREE: | | | | | | LiteralConstant -> IntLiteralConstant = '1'
+!PARSE-TREE: | | | | | Scalar -> Expr = '10_4'
+!PARSE-TREE: | | | | | | LiteralConstant -> IntLiteralConstant = '10'
+!PARSE-TREE: | | | Block
+!PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'a(int(i,kind=8))=i'
+!PARSE-TREE: | | | | | Variable = 'a(int(i,kind=8))'
+!PARSE-TREE: | | | | | | Designator -> DataRef -> ArrayElement
+!PARSE-TREE: | | | | | | | DataRef -> Name = 'a'
+!PARSE-TREE: | | | | | | | SectionSubscript -> Integer -> Expr = 'i'
+!PARSE-TREE: | | | | | | | | Designator -> DataRef -> Name = 'i'
+!PARSE-TREE: | | | | | Expr = 'i'
+!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'i'
+!PARSE-TREE: | | | EndDoStmt ->
+!PARSE-TREE: | OmpEndDirective
+!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = simd
+!PARSE-TREE: | | OmpClauseList ->
+!PARSE-TREE: | | Flags = {}
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index 0f2074c549c83..e1e66df72dfc5 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -378,8 +378,7 @@ def OMPC_NoGroup : Clause<[Spelling<"nogroup">]> {
 }
 def OMPC_NonTemporal : Clause<[Spelling<"nontemporal">]> {
   let clangClass = "OMPNontemporalClause";
-  let flangClass = "Name";
-  let isValueList = true;
+  let flangClass = "OmpObjectList";
 }
 def OMPC_Notinbranch : Clause<[Spelling<"notinbranch">]> {
 }



More information about the flang-commits mailing list