From 8c97501ba478596c1d3374f812314dae38201fa4 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Fri, 30 May 2025 09:20:24 +0000 Subject: [PATCH 1/3] [flang][OpenMP] Resolve names for declare simd uniform clause Add a visitor for OmpClause::Uniform to resolve its parameter names. Fixes issue #140741. Signed-off-by: Kajetan Puchalski --- flang/include/flang/Semantics/symbol.h | 2 +- flang/lib/Semantics/resolve-directives.cpp | 7 +++++++ flang/lib/Semantics/resolve-names.cpp | 5 +++++ .../test/Semantics/OpenMP/declare-simd-uniform.f90 | 13 +++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 flang/test/Semantics/OpenMP/declare-simd-uniform.f90 diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h index 4cded64d170cd..9ebdd3a8081ed 100644 --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -786,7 +786,7 @@ class Symbol { OmpExecutableAllocateDirective, OmpDeclareSimd, OmpDeclareTarget, OmpThreadprivate, OmpDeclareReduction, OmpFlushed, OmpCriticalLock, OmpIfSpecified, OmpNone, OmpPreDetermined, OmpImplicit, OmpDependObject, - OmpInclusiveScan, OmpExclusiveScan, OmpInScanReduction); + OmpInclusiveScan, OmpExclusiveScan, OmpInScanReduction, OmpUniform); using Flags = common::EnumSet; const Scope &owner() const { return *owner_; } diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 9fa7bc8964854..ecb4f02732a4b 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -550,6 +550,13 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { return false; } + bool Pre(const parser::OmpClause::Uniform &x) { + for (const auto &name : x.v) { + ResolveOmpName(name, Symbol::Flag::OmpUniform); + } + return false; + } + bool Pre(const parser::OmpInReductionClause &x) { auto &objects{std::get(x.t)}; ResolveOmpObjectList(objects, Symbol::Flag::OmpInReduction); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 57035c57ee16f..7bea6fdb00e55 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1511,6 +1511,11 @@ class OmpVisitor : public virtual DeclarationVisitor { return false; } + bool Pre(const parser::OpenMPDeclareSimdConstruct &x) { + AddOmpSourceRange(x.source); + return true; + } + bool Pre(const parser::OmpInitializerProc &x) { auto &procDes = std::get(x.t); auto &name = std::get(procDes.u); diff --git a/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 new file mode 100644 index 0000000000000..3a0c52b8e7b0e --- /dev/null +++ b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 @@ -0,0 +1,13 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenmp +! Test declare simd with uniform clause + +function add2(a,b,i,fact,alc) result(c) + !$omp declare simd(add2) uniform(a,b,fact) + integer :: i + integer,pointer::alc + double precision :: a(*),b(*),fact,c + c = a(i) + b(i) + fact +end function + +end + From 02defaaed6fd7f2e2db1ee964d32bcb164fe366b Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Mon, 2 Jun 2025 10:52:02 +0000 Subject: [PATCH 2/3] Fix OmpUniform flag handling, add debug symbol dump test --- flang/lib/Semantics/resolve-directives.cpp | 9 ++++----- flang/lib/Semantics/symbol.cpp | 3 +++ flang/test/Semantics/OpenMP/declare-simd-uniform.f90 | 9 +++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index ecb4f02732a4b..8fe5829d1d08c 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -551,9 +551,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { } bool Pre(const parser::OmpClause::Uniform &x) { - for (const auto &name : x.v) { - ResolveOmpName(name, Symbol::Flag::OmpUniform); - } + ResolveOmpNameList(x.v, Symbol::Flag::OmpUniform); return false; } @@ -749,7 +747,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { Symbol::Flags dataSharingAttributeFlags{Symbol::Flag::OmpShared, Symbol::Flag::OmpPrivate, Symbol::Flag::OmpFirstPrivate, Symbol::Flag::OmpLastPrivate, Symbol::Flag::OmpReduction, - Symbol::Flag::OmpLinear}; + Symbol::Flag::OmpLinear, Symbol::Flag::OmpUniform}; Symbol::Flags privateDataSharingAttributeFlags{Symbol::Flag::OmpPrivate, Symbol::Flag::OmpFirstPrivate, Symbol::Flag::OmpLastPrivate}; @@ -759,7 +757,8 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { Symbol::Flag::OmpLastPrivate, Symbol::Flag::OmpReduction, Symbol::Flag::OmpCriticalLock, Symbol::Flag::OmpCopyIn, Symbol::Flag::OmpUseDevicePtr, Symbol::Flag::OmpUseDeviceAddr, - Symbol::Flag::OmpIsDevicePtr, Symbol::Flag::OmpHasDeviceAddr}; + Symbol::Flag::OmpIsDevicePtr, Symbol::Flag::OmpHasDeviceAddr, + Symbol::Flag::OmpUniform}; Symbol::Flags ompFlagsRequireMark{Symbol::Flag::OmpThreadprivate, Symbol::Flag::OmpDeclareTarget, Symbol::Flag::OmpExclusiveScan, diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp index 2118970a7bf25..52f74035bd6a8 100644 --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -842,6 +842,9 @@ std::string Symbol::OmpFlagToClauseName(Symbol::Flag ompFlag) { case Symbol::Flag::OmpLinear: clauseName = "LINEAR"; break; + case Symbol::Flag::OmpUniform: + clauseName = "UNIFORM"; + break; case Symbol::Flag::OmpFirstPrivate: clauseName = "FIRSTPRIVATE"; break; diff --git a/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 index 3a0c52b8e7b0e..8d986300cd750 100644 --- a/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 +++ b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 @@ -1,4 +1,5 @@ ! RUN: %python %S/../test_errors.py %s %flang -fopenmp +! RUN: %flang_fc1 -fopenmp -fdebug-dump-symbols %s | FileCheck %s ! Test declare simd with uniform clause function add2(a,b,i,fact,alc) result(c) @@ -11,3 +12,11 @@ function add2(a,b,i,fact,alc) result(c) end +! CHECK-LABEL: Subprogram scope: add2 size=48 alignment=8 sourceRange=189 bytes +! CHECK-NEXT: a (OmpUniform): ObjectEntity dummy type: REAL(8) shape: 1_8:* +! CHECK-NEXT: add2 (Function): HostAssoc +! CHECK-NEXT: alc, POINTER size=24 offset=8: ObjectEntity dummy type: INTEGER(4) +! CHECK-NEXT: b (OmpUniform): ObjectEntity dummy type: REAL(8) shape: 1_8:* +! CHECK-NEXT: c size=8 offset=40: ObjectEntity funcResult type: REAL(8) +! CHECK-NEXT: fact (OmpUniform) size=8 offset=32: ObjectEntity dummy type: REAL(8) +! CHECK-NEXT: i size=4 offset=0: ObjectEntity dummy type: INTEGER(4) From 6c57af0de637b2ac019d7fe3646602d7c021b48b Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski Date: Mon, 2 Jun 2025 11:21:27 +0000 Subject: [PATCH 3/3] Remove OmpUniform from data sharing attrs --- flang/lib/Semantics/resolve-directives.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 8fe5829d1d08c..6884607edebb3 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -747,7 +747,7 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { Symbol::Flags dataSharingAttributeFlags{Symbol::Flag::OmpShared, Symbol::Flag::OmpPrivate, Symbol::Flag::OmpFirstPrivate, Symbol::Flag::OmpLastPrivate, Symbol::Flag::OmpReduction, - Symbol::Flag::OmpLinear, Symbol::Flag::OmpUniform}; + Symbol::Flag::OmpLinear}; Symbol::Flags privateDataSharingAttributeFlags{Symbol::Flag::OmpPrivate, Symbol::Flag::OmpFirstPrivate, Symbol::Flag::OmpLastPrivate};