[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
llvm-ci wrote: LLVM Buildbot has detected a new failure on builder `clang-cmake-x86_64-avx512-win` running on `avx512-intel64-win` while building `clang,flang` at step 4 "cmake stage 1". Full details are available at: https://lab.llvm.org/buildbot/#/builders/81/builds/4943 Here is the relevant piece of the build log for the reference ``` Step 4 (cmake stage 1) failure: 'cmake -G ...' (failure) 'cmake' is not recognized as an internal or external command, operable program or batch file. ``` https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby closed https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/tblah approved this pull request. LGTM, thanks! https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -3986,11 +3986,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { tarunprabhu wrote: > You'd hope that if this did change visibility for cl-mode and dxc-mode, and > someone was relying on it, it would break a test somewhere 😅 Hope springs eternal ... 😆 https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/tarunprabhu approved this pull request. LGTM. Thanks. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/tarunprabhu edited https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby edited https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, DavidTruby wrote: I should clarify that I decided to move them to `CommonArgs.cpp` as requested because these checks really are only relevant to the _compiler_ driver, and so shouldn't really be in the shared Frontend driver parts of `llvm`. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -3986,11 +3986,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { DavidTruby wrote: The docs [here](https://clang.llvm.org/docs/InternalsManual.html#adding-new-command-line-option) say that the default visibility is _only_ `ClangOption`, so this should only have the effect of adding FlangOption to that. I was basing this off of that documentation. You'd hope that if this did change visibility for cl-mode and dxc-mode, and someone was relying on it, it would break a test somewhere :sweat_smile: https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -3986,11 +3986,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { tarunprabhu wrote: Do you know if this makes `-fvectorize` unavailable in `cl-mode` and `dxc-mode`? Did the previous default visibility imply `CLOption` and `DXCOption`? There was a PR some time ago where the options became unavailable for those drivers because of some changes to the visibility. I can't remember what the defaults are now, but I am on holiday today, so I can look into it when I am back tomorrow. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
DavidTruby wrote: It looks like the force push has worked this time. Sorry it took so long to do, I was on holiday. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/119718 >From af135a1a4156be9076931ceeb92f75171a0cb7ad Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 12 Dec 2024 14:50:19 + Subject: [PATCH] [flang] Add -f[no-]vectorize flags --- clang/include/clang/Driver/Options.td | 11 +-- clang/lib/Driver/ToolChains/Clang.cpp | 33 --- clang/lib/Driver/ToolChains/CommonArgs.cpp| 33 +++ clang/lib/Driver/ToolChains/CommonArgs.h | 2 ++ clang/lib/Driver/ToolChains/Flang.cpp | 10 ++ .../include/flang/Frontend/CodeGenOptions.def | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 4 +++ flang/lib/Frontend/FrontendActions.cpp| 2 ++ flang/test/Driver/optimization-remark.f90 | 22 ++--- flang/test/Integration/unroll-loops.f90 | 4 +-- flang/test/Lower/HLFIR/unroll-loops.fir | 4 +-- 11 files changed, 75 insertions(+), 51 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 5ad187926e710..6824ffb8828d4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3986,11 +3986,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { def fvectorize : Flag<["-"], "fvectorize">, Group, HelpText<"Enable the loop vectorization passes">; def fno_vectorize : Flag<["-"], "fno-vectorize">, Group; def : Flag<["-"], "ftree-vectorize">, Alias; def : Flag<["-"], "fno-tree-vectorize">, Alias; +} + def fslp_vectorize : Flag<["-"], "fslp-vectorize">, Group, HelpText<"Enable the superword-level parallelism vectorization passes">; def fno_slp_vectorize : Flag<["-"], "fno-slp-vectorize">, Group; @@ -7332,6 +7336,10 @@ def mlink_builtin_bitcode : Separate<["-"], "mlink-builtin-bitcode">, def mlink_bitcode_file : Separate<["-"], "mlink-bitcode-file">, HelpText<"Link the given bitcode file before performing optimizations.">; + +def vectorize_loops : Flag<["-"], "vectorize-loops">, + HelpText<"Run the Loop vectorization passes">, + MarshallingInfoFlag>; } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { @@ -7447,9 +7455,6 @@ defm link_builtin_bitcode_postopt: BoolMOption<"link-builtin-bitcode-postopt", PosFlag, NegFlag>; -def vectorize_loops : Flag<["-"], "vectorize-loops">, - HelpText<"Run the Loop vectorization passes">, - MarshallingInfoFlag>; def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 96af466e067a8..7c50970068fa9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -511,39 +511,6 @@ static void addCoveragePrefixMapArg(const Driver &D, const ArgList &Args, } } -/// Vectorize at all optimization levels greater than 1 except for -Oz. -/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is -/// enabled. -static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { -if (A->getOption().matches(options::OPT_O4) || -A->getOption().matches(options::OPT_Ofast)) - return true; - -if (A->getOption().matches(options::OPT_O0)) - return false; - -assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag"); - -// Vectorize -Os. -StringRef S(A->getValue()); -if (S == "s") - return true; - -// Don't vectorize -Oz, unless it's the slp vectorizer. -if (S == "z") - return isSlpVec; - -unsigned OptLevel = 0; -if (S.getAsInteger(10, OptLevel)) - return false; - -return OptLevel > 1; - } - - return false; -} - /// Add -x lang to \p CmdArgs for \p Input. static void addDashXForInput(const ArgList &Args, const InputInfo &Input, ArgStringList &CmdArgs) { diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 2d01943ca1ac4..1a2299a92c54e 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -3133,3 +3133,36 @@ void tools::renderCommonIntegerOverflowOptions(const ArgList &Args, if (use_fwrapv_pointer) CmdArgs.push_back("-fwrapv-pointer"); } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool tools::shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { +if (A->getOption().matches(options::OPT_O4) || +A->getOption().matches(options::OPT_Ofast)) +
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
tarunprabhu wrote: I don't see a "processing updates" message, but the diffs look like the ones where the entire file was formatted. I'll take a look again when this gets sorted out. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
jeanPerier wrote: > A rebase to main head and force push helped in another instance of > "Processing updates" I had that twice on my PRs last week. The "Processing updates" was still stuck after a day. A rebase and force push also "solved" the issue. I do not recall facing that before, maybe there is a degradation of service on Github side. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
vzakhari wrote: > I have force pushed this to my branch but github doesn't seem to be picking > it up on this review?? I don't really know how to fix this. A rebase to main head and force push helped in another instance of "Processing updates" https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
DavidTruby wrote: I have force pushed this to my branch but github doesn't seem to be picking it up on this review?? I don't really know how to fix this. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
DavidTruby wrote: Ugh it looks like my editor just clang-formatted everything instead of only changes... https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby updated https://github.com/llvm/llvm-project/pull/119718 >From 0dc613d94560cbe4e8a57eed35d985e9d6dae752 Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 12 Dec 2024 14:50:19 + Subject: [PATCH] [flang] Add -f[no-]vectorize flags --- clang/include/clang/Driver/Driver.h | 38 ++--- clang/include/clang/Driver/Options.td | 11 +- clang/lib/Driver/Driver.cpp | 133 +- clang/lib/Driver/ToolChains/Clang.cpp | 33 - clang/lib/Driver/ToolChains/CommonArgs.cpp| 87 clang/lib/Driver/ToolChains/CommonArgs.h | 2 + clang/lib/Driver/ToolChains/Flang.cpp | 10 ++ .../include/flang/Frontend/CodeGenOptions.def | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 4 + flang/lib/Frontend/FrontendActions.cpp| 2 + flang/test/Driver/optimization-remark.f90 | 22 +-- flang/test/Integration/unroll-loops.f90 | 4 +- flang/test/Lower/HLFIR/unroll-loops.fir | 4 +- 13 files changed, 175 insertions(+), 176 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index f4a52cc529b79cd..bca9cfd85c367cd 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -55,12 +55,7 @@ class JobAction; class ToolChain; /// Describes the kind of LTO mode selected via -f(no-)?lto(=.*)? options. -enum LTOKind { - LTOK_None, - LTOK_Full, - LTOK_Thin, - LTOK_Unknown -}; +enum LTOKind { LTOK_None, LTOK_Full, LTOK_Thin, LTOK_Unknown }; /// Whether headers used to construct C++20 module units should be looked /// up by the path supplied on the command line, or in the user or system @@ -110,17 +105,9 @@ class Driver { DXCMode } Mode; - enum SaveTempsMode { -SaveTempsNone, -SaveTempsCwd, -SaveTempsObj - } SaveTemps; + enum SaveTempsMode { SaveTempsNone, SaveTempsCwd, SaveTempsObj } SaveTemps; - enum BitcodeEmbedMode { -EmbedNone, -EmbedMarker, -EmbedBitcode - } BitcodeEmbed; + enum BitcodeEmbedMode { EmbedNone, EmbedMarker, EmbedBitcode } BitcodeEmbed; enum OffloadMode { OffloadHostDevice, @@ -166,9 +153,7 @@ class Driver { }; // Diag - Forwarding function for diagnostics. - DiagnosticBuilder Diag(unsigned DiagID) const { -return Diags.Report(DiagID); - } + DiagnosticBuilder Diag(unsigned DiagID) const { return Diags.Report(DiagID); } // FIXME: Privatize once interface is stable. public: @@ -404,7 +389,6 @@ class Driver { SmallString<128> &CrashDiagDir); public: - /// Takes the path to a binary that's either in bin/ or lib/ and returns /// the path to clang's resource directory. static std::string GetResourcesPath(StringRef BinaryPath); @@ -419,9 +403,7 @@ class Driver { /// Name to use when invoking gcc/g++. const std::string &getCCCGenericGCCName() const { return CCCGenericGCCName; } - llvm::ArrayRef getConfigFiles() const { -return ConfigFiles; - } + llvm::ArrayRef getConfigFiles() const { return ConfigFiles; } const llvm::opt::OptTable &getOpts() const { return getDriverOptTable(); } @@ -447,9 +429,7 @@ class Driver { std::string getTargetTriple() const { return TargetTriple; } /// Get the path to the main clang executable. - const char *getClangProgramPath() const { -return ClangExecutable.c_str(); - } + const char *getClangProgramPath() const { return ClangExecutable.c_str(); } bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; } bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; } @@ -561,8 +541,9 @@ class Driver { /// This routine handles additional processing that must be done in addition /// to just running the subprocesses, for example reporting errors, setting /// up response files, removing temporary files, etc. - int ExecuteCompilation(Compilation &C, - SmallVectorImpl< std::pair > &FailingCommands); + int ExecuteCompilation( + Compilation &C, + SmallVectorImpl> &FailingCommands); /// Contains the files in the compilation diagnostic report generated by /// generateCompilationDiagnostics. @@ -758,7 +739,6 @@ class Driver { const CUIDOptions &getCUIDOpts() const { return CUIDOpts; } private: - /// Tries to load options from configuration files. /// /// \returns true if error occurred. diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 77ca2d2aac31be1..3cc9492eac1c200 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3981,11 +3981,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { def fvectorize : Flag<["-"], "fvectorize">, Group, HelpText<"Enable the loop vectorization passes">; def f
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/tarunprabhu requested changes to this pull request. Please move code to be shared between `clang` and `flang` to `clang/lib/Driver/ToolChains/CommonArgs.cpp` https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, tarunprabhu wrote: Since this was originally in the clang toolchain file, it may be better to move it to `clang/lib/Driver/ToolChains/CommonArgs.cpp`. This [has been done](https://github.com/llvm/llvm-project/pull/110132) for other code that is now shared between clang and flang. https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, DavidTruby wrote: This should be able to go there I think; I'll move it if the RFC makes progress https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
@@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, tblah wrote: We have made some attempts to move shared logic out of `clang/` into `llvm/lib/Frontend/Driver`. Maybe this should go there too? https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby converted_to_draft https://github.com/llvm/llvm-project/pull/119718 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
llvmbot wrote: @llvm/pr-subscribers-flang-driver @llvm/pr-subscribers-clang Author: David Truby (DavidTruby) Changes This patch adds the -fvectorize and -fno-vectorize flags to flang. Note that this also changes the behaviour of `flang -fc1` to match that of `clang -cc1`, which is that vectorization is only enabled in the presence of the `-vectorize-loops` flag. Additionally, this patch changes the behaviour of the default optimisation levels to match clang, such that vectorization only happens at the same levels as it does there. This patch is in draft while I write an RFC to discuss the above two changes. --- Full diff: https://github.com/llvm/llvm-project/pull/119718.diff 9 Files Affected: - (modified) clang/include/clang/Driver/Driver.h (+3) - (modified) clang/include/clang/Driver/Options.td (+8-3) - (modified) clang/lib/Driver/Driver.cpp (+34) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (-33) - (modified) clang/lib/Driver/ToolChains/Flang.cpp (+10) - (modified) flang/include/flang/Frontend/CodeGenOptions.def (+1) - (modified) flang/lib/Frontend/CompilerInvocation.cpp (+4) - (modified) flang/lib/Frontend/FrontendActions.cpp (+3) - (modified) flang/test/Driver/optimization-remark.f90 (+11-11) ``diff diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index c23d037e725bb9..4c4375b25902c4 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -856,6 +856,9 @@ void applyOverrideOptions(SmallVectorImpl &Args, llvm::StringSet<> &SavedStrings, raw_ostream *OS = nullptr); +bool shouldEnableVectorizerAtOLevel(const llvm::opt::ArgList &Args, +bool isSlpVec); + } // end namespace driver } // end namespace clang diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 88862ae9edb29d..bc3c1e4a0045ff 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4038,11 +4038,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { def fvectorize : Flag<["-"], "fvectorize">, Group, HelpText<"Enable the loop vectorization passes">; def fno_vectorize : Flag<["-"], "fno-vectorize">, Group; def : Flag<["-"], "ftree-vectorize">, Alias; def : Flag<["-"], "fno-tree-vectorize">, Alias; +} + def fslp_vectorize : Flag<["-"], "fslp-vectorize">, Group, HelpText<"Enable the superword-level parallelism vectorization passes">; def fno_slp_vectorize : Flag<["-"], "fno-slp-vectorize">, Group; @@ -7323,6 +7327,10 @@ let Visibility = [CC1Option, FC1Option] in { def mlink_builtin_bitcode : Separate<["-"], "mlink-builtin-bitcode">, HelpText<"Link and internalize needed symbols from the given bitcode file " "before performing optimizations.">; + +def vectorize_loops : Flag<["-"], "vectorize-loops">, + HelpText<"Run the Loop vectorization passes">, + MarshallingInfoFlag>; } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { @@ -7439,9 +7447,6 @@ defm link_builtin_bitcode_postopt: BoolMOption<"link-builtin-bitcode-postopt", PosFlag, NegFlag>; -def vectorize_loops : Flag<["-"], "vectorize-loops">, - HelpText<"Run the Loop vectorization passes">, - MarshallingInfoFlag>; def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index fb73b62cf2daed..1510af0047fc47 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, +bool isSlpVec) { + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { +if (A->getOption().matches(options::OPT_O4) || +A->getOption().matches(options::OPT_Ofast)) + return true; + +if (A->getOption().matches(options::OPT_O0)) + return false; + +assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag"); + +// Vectorize -Os. +StringRef S(A->getValue()); +if (S == "s") + return true; + +// Don't vectorize -Oz, unless it's the slp vectorizer. +if (S == "z") + return isSlpVec; + +unsigned OptLevel = 0; +if (S.getAsInteger(10, OptLevel)) + return false; + +return OptLevel > 1; + } + + return false; +} diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d3206c3e8e25e
[clang] [flang] [flang] Add -f[no-]vectorize flags (PR #119718)
https://github.com/DavidTruby created https://github.com/llvm/llvm-project/pull/119718 This patch adds the -fvectorize and -fno-vectorize flags to flang. Note that this also changes the behaviour of `flang -fc1` to match that of `clang -cc1`, which is that vectorization is only enabled in the presence of the `-vectorize-loops` flag. Additionally, this patch changes the behaviour of the default optimisation levels to match clang, such that vectorization only happens at the same levels as it does there. This patch is in draft while I write an RFC to discuss the above two changes. >From 0b9cbef8073cdfc511087c315deb82a90c408640 Mon Sep 17 00:00:00 2001 From: David Truby Date: Thu, 12 Dec 2024 14:50:19 + Subject: [PATCH] [flang] Add -f[no-]vectorize flags --- clang/include/clang/Driver/Driver.h | 3 ++ clang/include/clang/Driver/Options.td | 11 -- clang/lib/Driver/Driver.cpp | 34 +++ clang/lib/Driver/ToolChains/Clang.cpp | 33 -- clang/lib/Driver/ToolChains/Flang.cpp | 10 ++ .../include/flang/Frontend/CodeGenOptions.def | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 4 +++ flang/lib/Frontend/FrontendActions.cpp| 3 ++ flang/test/Driver/optimization-remark.f90 | 22 ++-- 9 files changed, 74 insertions(+), 47 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index c23d037e725bb9..4c4375b25902c4 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -856,6 +856,9 @@ void applyOverrideOptions(SmallVectorImpl &Args, llvm::StringSet<> &SavedStrings, raw_ostream *OS = nullptr); +bool shouldEnableVectorizerAtOLevel(const llvm::opt::ArgList &Args, +bool isSlpVec); + } // end namespace driver } // end namespace clang diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 88862ae9edb29d..bc3c1e4a0045ff 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4038,11 +4038,15 @@ defm assumptions : BoolFOption<"assumptions", "Disable codegen and compile-time checks for C++23's [[assume]] attribute">, PosFlag>; + +let Visibility = [ClangOption, FlangOption] in { def fvectorize : Flag<["-"], "fvectorize">, Group, HelpText<"Enable the loop vectorization passes">; def fno_vectorize : Flag<["-"], "fno-vectorize">, Group; def : Flag<["-"], "ftree-vectorize">, Alias; def : Flag<["-"], "fno-tree-vectorize">, Alias; +} + def fslp_vectorize : Flag<["-"], "fslp-vectorize">, Group, HelpText<"Enable the superword-level parallelism vectorization passes">; def fno_slp_vectorize : Flag<["-"], "fno-slp-vectorize">, Group; @@ -7323,6 +7327,10 @@ let Visibility = [CC1Option, FC1Option] in { def mlink_builtin_bitcode : Separate<["-"], "mlink-builtin-bitcode">, HelpText<"Link and internalize needed symbols from the given bitcode file " "before performing optimizations.">; + +def vectorize_loops : Flag<["-"], "vectorize-loops">, + HelpText<"Run the Loop vectorization passes">, + MarshallingInfoFlag>; } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { @@ -7439,9 +7447,6 @@ defm link_builtin_bitcode_postopt: BoolMOption<"link-builtin-bitcode-postopt", PosFlag, NegFlag>; -def vectorize_loops : Flag<["-"], "vectorize-loops">, - HelpText<"Run the Loop vectorization passes">, - MarshallingInfoFlag>; def vectorize_slp : Flag<["-"], "vectorize-slp">, HelpText<"Run the SLP vectorization passes">, MarshallingInfoFlag>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index fb73b62cf2daed..1510af0047fc47 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -6980,3 +6980,37 @@ void driver::applyOverrideOptions(SmallVectorImpl &Args, ++S; } } + +/// Vectorize at all optimization levels greater than 1 except for -Oz. +/// For -Oz the loop vectorizer is disabled, while the slp vectorizer is +/// enabled. +bool driver::shouldEnableVectorizerAtOLevel(const ArgList &Args, +bool isSlpVec) { + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { +if (A->getOption().matches(options::OPT_O4) || +A->getOption().matches(options::OPT_Ofast)) + return true; + +if (A->getOption().matches(options::OPT_O0)) + return false; + +assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag"); + +// Vectorize -Os. +StringRef S(A->getValue()); +if (S == "s") + return true; + +// Don't vectorize -Oz, unless it's the slp vectorizer. +if (S == "z") + return isSlpVec; + +unsigned OptLevel = 0; +if (S.getAsInteger(10, OptLevel)) + return false; + +return OptLevel > 1; + } + + return false; +