https://github.com/mjklemm updated https://github.com/llvm/llvm-project/pull/120287
>From ef9b76ad1dfb4b6c99bbdf6391fe57b944ffbfa2 Mon Sep 17 00:00:00 2001 From: Michael Klemm <michael.kl...@amd.com> Date: Tue, 17 Dec 2024 18:34:06 +0100 Subject: [PATCH 1/4] Implement -fopenmp-default-none compiler flag --- clang/include/clang/Driver/Options.td | 3 +++ clang/lib/Driver/ToolChains/Flang.cpp | 3 +++ flang/include/flang/Common/Fortran-features.h | 2 +- flang/lib/Common/Fortran-features.cpp | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 4 ++++ flang/lib/Semantics/resolve-directives.cpp | 8 +++++++- 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index bed2a56b003512..acbe93fe72a24e 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3596,6 +3596,9 @@ def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[NoArgumentUnused]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, HelpText<"Parse OpenMP pragmas and generate parallel code.">; +def fopenmp_default_none : Flag<["-"], "fopenmp-default-none">, Group<f_Group>, + Visibility<[FlangOption, FC1Option]>, + HelpText<"Add DEFAULT(NONE) to all OpenMP directives that allow data-sharing clauses.">; def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, Flags<[NoArgumentUnused]>; diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index c98fdbd157bac8..521ae90e0bd164 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -855,6 +855,9 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA, // is experimental. D.Diag(diag::warn_openmp_experimental); + if (Args.hasArg((options::OPT_fopenmp_default_none))) + CmdArgs.push_back("-fopenmp-default-none"); + // FIXME: Clang supports a whole bunch more flags here. break; default: diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h index b04f6117ae9656..218e05e53aee01 100644 --- a/flang/include/flang/Common/Fortran-features.h +++ b/flang/include/flang/Common/Fortran-features.h @@ -54,7 +54,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, PolymorphicActualAllocatableOrPointerToMonomorphicDummy, RelaxedPureDummy, UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram, PrintCptr, SavedLocalInSpecExpr, PrintNamelist, AssumedRankPassedToNonAssumedRank, - IgnoreIrrelevantAttributes) + IgnoreIrrelevantAttributes, OpenMPDefaultNone) // Portability and suspicious usage warnings ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, diff --git a/flang/lib/Common/Fortran-features.cpp b/flang/lib/Common/Fortran-features.cpp index c86432874b8d83..c6f818478b065c 100644 --- a/flang/lib/Common/Fortran-features.cpp +++ b/flang/lib/Common/Fortran-features.cpp @@ -17,6 +17,7 @@ LanguageFeatureControl::LanguageFeatureControl() { disable_.set(LanguageFeature::OldDebugLines); disable_.set(LanguageFeature::OpenACC); disable_.set(LanguageFeature::OpenMP); + disable_.set(LanguageFeature::OpenMPDefaultNone); disable_.set(LanguageFeature::CUDA); // !@cuf disable_.set(LanguageFeature::CudaManaged); disable_.set(LanguageFeature::CudaUnified); diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 648b88e84051c2..648ad224a26f66 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1023,6 +1023,10 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, res.getLangOpts().OpenMPVersion, diags)) { res.getLangOpts().OpenMPVersion = Version; } + if (args.hasArg(clang::driver::options::OPT_fopenmp_default_none)) { + res.getFrontendOpts().features.Enable( + Fortran::common::LanguageFeature::OpenMPDefaultNone); + } if (args.hasArg(clang::driver::options::OPT_fopenmp_force_usm)) { res.getLangOpts().OpenMPForceUSM = 1; } diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 39478b58a9070d..9cefc36d987b15 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -2268,6 +2268,11 @@ void OmpAttributeVisitor::CreateImplicitSymbols( void OmpAttributeVisitor::Post(const parser::Name &name) { auto *symbol{name.symbol}; + // if -fopenmp-default-none was given on the command line, act as if + // DEFAULT(NONE) was present at the directive. + bool HaveOpenMPDefaultNone = context_.languageFeatures().IsEnabled( + common::LanguageFeature::OpenMPDefaultNone); + if (symbol && !dirContext_.empty() && GetContext().withinConstruct) { if (IsPrivatizable(symbol) && !IsObjectWithDSA(*symbol)) { // TODO: create a separate function to go through the rules for @@ -2276,7 +2281,8 @@ void OmpAttributeVisitor::Post(const parser::Name &name) { if (Symbol * found{currScope().FindSymbol(name.source)}) { if (symbol != found) { name.symbol = found; // adjust the symbol within region - } else if (GetContext().defaultDSA == Symbol::Flag::OmpNone && + } else if ((HaveOpenMPDefaultNone || + GetContext().defaultDSA == Symbol::Flag::OmpNone) && !symbol->test(Symbol::Flag::OmpThreadprivate) && // Exclude indices of sequential loops that are privatised in // the scope of the parallel region, and not in this scope. >From e5a71fc4bb47160085fa04948b93bd1ece11b37f Mon Sep 17 00:00:00 2001 From: Michael Klemm <michael.kl...@amd.com> Date: Tue, 17 Dec 2024 18:42:41 +0100 Subject: [PATCH 2/4] Add test for -fopenmp-default-none --- flang/test/Semantics/OpenMP/resolve07.f90 | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 flang/test/Semantics/OpenMP/resolve07.f90 diff --git a/flang/test/Semantics/OpenMP/resolve07.f90 b/flang/test/Semantics/OpenMP/resolve07.f90 new file mode 100644 index 00000000000000..4a898903fae431 --- /dev/null +++ b/flang/test/Semantics/OpenMP/resolve07.f90 @@ -0,0 +1,34 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-default-none + + +! Test that -fopenmp-default-none shows the same errors as DEFAULT(NONE) +subroutine default_none() + integer a(3) + integer, parameter :: D=10 + A = 1 + B = 2 + !$omp parallel private(c) + !ERROR: The DEFAULT(NONE) clause requires that 'a' must be listed in a data-sharing attribute clause + A(1:2) = 3 + !ERROR: The DEFAULT(NONE) clause requires that 'b' must be listed in a data-sharing attribute clause + B = 4 + C = 5 + D + !$omp end parallel +end subroutine default_none + +! Test that indices of sequential loops are privatised and hence do not error +! for -fopenmp-default-none. +subroutine default_none_seq_loop + integer :: i + + !$omp parallel do + do i = 1, 10 + do j = 1, 20 + enddo + enddo +end subroutine + +program mm + call default_none() + call default_none_seq_loop() +end >From 4dbad748a8b89ba06a64b9f79ca1b06fd4d5427e Mon Sep 17 00:00:00 2001 From: Michael Klemm <michael.kl...@amd.com> Date: Wed, 18 Dec 2024 13:53:18 +0100 Subject: [PATCH 3/4] Move -fopenmp-default-none to the end of OpenMP options --- clang/include/clang/Driver/Options.td | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index acbe93fe72a24e..b12cd6098e7aa2 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3596,9 +3596,6 @@ def fopenmp : Flag<["-"], "fopenmp">, Group<f_Group>, Flags<[NoArgumentUnused]>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, HelpText<"Parse OpenMP pragmas and generate parallel code.">; -def fopenmp_default_none : Flag<["-"], "fopenmp-default-none">, Group<f_Group>, - Visibility<[FlangOption, FC1Option]>, - HelpText<"Add DEFAULT(NONE) to all OpenMP directives that allow data-sharing clauses.">; def fno_openmp : Flag<["-"], "fno-openmp">, Group<f_Group>, Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, Flags<[NoArgumentUnused]>; @@ -3651,6 +3648,9 @@ def fopenmp_cuda_blocks_per_sm_EQ : Joined<["-"], "fopenmp-cuda-blocks-per-sm="> Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; def fopenmp_cuda_teams_reduction_recs_num_EQ : Joined<["-"], "fopenmp-cuda-teams-reduction-recs-num=">, Group<f_Group>, Flags<[NoArgumentUnused, HelpHidden]>, Visibility<[ClangOption, CC1Option]>; +def fopenmp_default_none : Flag<["-"], "fopenmp-default-none">, Group<f_Group>, + Visibility<[FlangOption, FC1Option]>, + HelpText<"Add DEFAULT(NONE) to all OpenMP directives that allow data-sharing clauses.">; //===----------------------------------------------------------------------===// // Shared cc1 + fc1 OpenMP Target Options >From ffafbfdc48692f41aa1e2bc9f4c465a48fcf7cab Mon Sep 17 00:00:00 2001 From: Michael Klemm <michael.kl...@amd.com> Date: Wed, 18 Dec 2024 13:53:47 +0100 Subject: [PATCH 4/4] Rename variable --- flang/lib/Semantics/resolve-directives.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 9cefc36d987b15..602e8584038825 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -2270,7 +2270,7 @@ void OmpAttributeVisitor::Post(const parser::Name &name) { // if -fopenmp-default-none was given on the command line, act as if // DEFAULT(NONE) was present at the directive. - bool HaveOpenMPDefaultNone = context_.languageFeatures().IsEnabled( + bool haveOpenMPDefaultNone = context_.languageFeatures().IsEnabled( common::LanguageFeature::OpenMPDefaultNone); if (symbol && !dirContext_.empty() && GetContext().withinConstruct) { @@ -2281,7 +2281,7 @@ void OmpAttributeVisitor::Post(const parser::Name &name) { if (Symbol * found{currScope().FindSymbol(name.source)}) { if (symbol != found) { name.symbol = found; // adjust the symbol within region - } else if ((HaveOpenMPDefaultNone || + } else if ((haveOpenMPDefaultNone || GetContext().defaultDSA == Symbol::Flag::OmpNone) && !symbol->test(Symbol::Flag::OmpThreadprivate) && // Exclude indices of sequential loops that are privatised in _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits