[flang-commits] [flang] [llvm] [flang][OpenMP] Change NONTEMPORAL clause to contain OmpObjectList (PR #195331)
via flang-commits
flang-commits at lists.llvm.org
Fri May 1 12:20:12 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-openmp
Author: Krzysztof Parzyszek (kparzysz)
<details>
<summary>Changes</summary>
NONTEMPORAL in source code takes a variable list, which is represented in the AST as OmpObjectList.
---
Full diff: https://github.com/llvm/llvm-project/pull/195331.diff
6 Files Affected:
- (modified) flang/lib/Lower/OpenMP/Clauses.cpp (+2-2)
- (modified) flang/lib/Parser/openmp-parsers.cpp (+1-1)
- (modified) flang/lib/Semantics/check-omp-structure.cpp (+6-1)
- (modified) flang/lib/Semantics/resolve-directives.cpp (+2-2)
- (modified) flang/test/Parser/OpenMP/nontemporal-unparse.f90 (+41-5)
- (modified) llvm/include/llvm/Frontend/OpenMP/OMP.td (+1-2)
``````````diff
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">]> {
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/195331
More information about the flang-commits
mailing list