https://github.com/mrkajetanp updated https://github.com/llvm/llvm-project/pull/132801
>From d9b2a86d01688b69b8f116f6b52caeec8cd6e756 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski <kajetan.puchal...@arm.com> Date: Mon, 24 Mar 2025 17:28:03 +0000 Subject: [PATCH 1/4] [flang] Add -f[no-]slp-vectorize flags Add -f[no-]slp-vectorize to the flang driver. Add corresponding -fvectorize-slp to the flang frontend. Signed-off-by: Kajetan Puchalski <kajetan.puchal...@arm.com> --- clang/include/clang/Driver/Options.td | 9 ++++++--- clang/lib/Driver/ToolChains/Flang.cpp | 8 ++++++++ flang/include/flang/Frontend/CodeGenOptions.def | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 3 +++ flang/lib/Frontend/FrontendActions.cpp | 1 + flang/test/Driver/slp-vectorize.f90 | 10 ++++++++++ 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 flang/test/Driver/slp-vectorize.f90 diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 59a57c83c6b89..a2cdf9f26fcdf 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4032,11 +4032,14 @@ def : Flag<["-"], "ftree-vectorize">, Alias<fvectorize>; def : Flag<["-"], "fno-tree-vectorize">, Alias<fno_vectorize>; } +let Visibility = [ClangOption, FlangOption] in { def fslp_vectorize : Flag<["-"], "fslp-vectorize">, Group<f_Group>, HelpText<"Enable the superword-level parallelism vectorization passes">; def fno_slp_vectorize : Flag<["-"], "fno-slp-vectorize">, Group<f_Group>; def : Flag<["-"], "ftree-slp-vectorize">, Alias<fslp_vectorize>; def : Flag<["-"], "fno-tree-slp-vectorize">, Alias<fno_slp_vectorize>; +} + def Wlarge_by_value_copy_def : Flag<["-"], "Wlarge-by-value-copy">, HelpText<"Warn if a function definition returns or accepts an object larger " "in bytes than a given value">, Flags<[HelpHidden]>; @@ -7384,6 +7387,9 @@ def mlink_bitcode_file def vectorize_loops : Flag<["-"], "vectorize-loops">, HelpText<"Run the Loop vectorization passes">, MarshallingInfoFlag<CodeGenOpts<"VectorizeLoop">>; +def vectorize_slp : Flag<["-"], "vectorize-slp">, + HelpText<"Run the SLP vectorization passes">, + MarshallingInfoFlag<CodeGenOpts<"VectorizeSLP">>; } // let Visibility = [CC1Option, FC1Option] let Visibility = [CC1Option] in { @@ -7499,9 +7505,6 @@ defm link_builtin_bitcode_postopt: BoolMOption<"link-builtin-bitcode-postopt", PosFlag<SetTrue, [], [ClangOption], "Link builtin bitcodes after the " "optimization pipeline">, NegFlag<SetFalse, [], [ClangOption]>>; -def vectorize_slp : Flag<["-"], "vectorize-slp">, - HelpText<"Run the SLP vectorization passes">, - MarshallingInfoFlag<CodeGenOpts<"VectorizeSLP">>; def linker_option : Joined<["--"], "linker-option=">, HelpText<"Add linker option">, MarshallingInfoStringVector<CodeGenOpts<"LinkerOptions">>; diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 5dbc5cbe77d0a..bb89432d3e58c 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -161,6 +161,14 @@ void Flang::addCodegenOptions(const ArgList &Args, options::OPT_fno_vectorize, enableVec)) CmdArgs.push_back("-vectorize-loops"); + // -fslp-vectorize is enabled based on the optimization level selected. + bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); + OptSpecifier SLPVectAliasOption = + EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; + if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, + options::OPT_fno_slp_vectorize, EnableSLPVec)) + CmdArgs.push_back("-vectorize-slp"); + if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); diff --git a/flang/include/flang/Frontend/CodeGenOptions.def b/flang/include/flang/Frontend/CodeGenOptions.def index 44cb5a2cdd497..5d6af4271d4f6 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.def +++ b/flang/include/flang/Frontend/CodeGenOptions.def @@ -32,6 +32,7 @@ CODEGENOPT(PrepareForThinLTO , 1, 0) ///< Set when -flto=thin is enabled on the ///< compile step. CODEGENOPT(StackArrays, 1, 0) ///< -fstack-arrays (enable the stack-arrays pass) CODEGENOPT(VectorizeLoop, 1, 0) ///< Enable loop vectorization. +CODEGENOPT(VectorizeSLP, 1, 0) ///< Enable SLP vectorization. CODEGENOPT(LoopVersioning, 1, 0) ///< Enable loop versioning. CODEGENOPT(UnrollLoops, 1, 0) ///< Enable loop unrolling CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index f433ec9966922..652b3d8795ab7 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -246,6 +246,9 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts, if (args.getLastArg(clang::driver::options::OPT_vectorize_loops)) opts.VectorizeLoop = 1; + if (args.getLastArg(clang::driver::options::OPT_vectorize_slp)) + opts.VectorizeSLP = 1; + if (args.hasFlag(clang::driver::options::OPT_floop_versioning, clang::driver::options::OPT_fno_loop_versioning, false)) opts.LoopVersioning = 1; diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 46ec7550e4140..3e6e98855fe7a 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -933,6 +933,7 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { pto.LoopUnrolling = opts.UnrollLoops; pto.LoopInterleaving = opts.UnrollLoops; pto.LoopVectorization = opts.VectorizeLoop; + pto.SLPVectorization = opts.VectorizeSLP; llvm::PassBuilder pb(targetMachine, pto, pgoOpt, &pic); diff --git a/flang/test/Driver/slp-vectorize.f90 b/flang/test/Driver/slp-vectorize.f90 new file mode 100644 index 0000000000000..55d4be1a13c71 --- /dev/null +++ b/flang/test/Driver/slp-vectorize.f90 @@ -0,0 +1,10 @@ +! RUN: %flang -### -S -fslp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! RUN: %flang -### -S -fno-slp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-NO-SLP-VECTORIZE %s +! RUN: %flang -### -S -O1 %s 2>&1 | FileCheck -check-prefix=CHECK-NO-SLP-VECTORIZE %s +! RUN: %flang -### -S -O2 %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! RUN: %flang -### -S -O3 %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! CHECK-SLP-VECTORIZE: "-vectorize-slp" +! CHECK-NO-SLP-VECTORIZE-NOT: "-no-vectorize-slp" + +program test +end program >From e78240d8c30122efdc6d85a771ff62c438d52159 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski <kajetan.puchal...@arm.com> Date: Tue, 25 Mar 2025 12:02:45 +0000 Subject: [PATCH 2/4] [flang] [clang] Move -fvectorize and -fslp-vectorize into CommonArgs flang - Expand tests for -fslp-vectorize Signed-off-by: Kajetan Puchalski <kajetan.puchal...@arm.com> --- clang/include/clang/Driver/Options.td | 2 -- clang/lib/Driver/ToolChains/Clang.cpp | 20 ++------------------ clang/lib/Driver/ToolChains/CommonArgs.cpp | 22 ++++++++++++++++++++++ clang/lib/Driver/ToolChains/CommonArgs.h | 6 ++++++ clang/lib/Driver/ToolChains/Flang.cpp | 19 ++----------------- flang/test/Driver/slp-vectorize.f90 | 5 +++++ 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index a2cdf9f26fcdf..ca56ed264e1d6 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4030,9 +4030,7 @@ def fvectorize : Flag<["-"], "fvectorize">, Group<f_Group>, def fno_vectorize : Flag<["-"], "fno-vectorize">, Group<f_Group>; def : Flag<["-"], "ftree-vectorize">, Alias<fvectorize>; def : Flag<["-"], "fno-tree-vectorize">, Alias<fno_vectorize>; -} -let Visibility = [ClangOption, FlangOption] in { def fslp_vectorize : Flag<["-"], "fslp-vectorize">, Group<f_Group>, HelpText<"Enable the superword-level parallelism vectorization passes">; def fno_slp_vectorize : Flag<["-"], "fno-slp-vectorize">, Group<f_Group>; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 7aa2b32acc235..e1e8f57dd6455 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7597,24 +7597,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.addOptOutFlag(CmdArgs, options::OPT_fgnu_inline_asm, options::OPT_fno_gnu_inline_asm); - // Enable vectorization per default according to the optimization level - // selected. For optimization levels that want vectorization we use the alias - // option to simplify the hasFlag logic. - bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false); - OptSpecifier VectorizeAliasOption = - EnableVec ? options::OPT_O_Group : options::OPT_fvectorize; - if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption, - options::OPT_fno_vectorize, EnableVec)) - CmdArgs.push_back("-vectorize-loops"); - - // -fslp-vectorize is enabled based on the optimization level selected. - bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); - OptSpecifier SLPVectAliasOption = - EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; - if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, - options::OPT_fno_slp_vectorize, EnableSLPVec)) - CmdArgs.push_back("-vectorize-slp"); - + handleVectorizeLoopsArgs(Args, CmdArgs); + handleVectorizeSLPArgs(Args, CmdArgs); ParseMPreferVectorWidth(D, Args, CmdArgs); Args.AddLastArg(CmdArgs, options::OPT_fshow_overloads_EQ); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 157b9ff971add..29c78f874d206 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -3177,3 +3177,25 @@ bool tools::shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { return false; } + +/// Enable -fvectorize based on the optimization level selected. +void tools::handleVectorizeLoopsArgs(const ArgList &Args, + ArgStringList &CmdArgs) { + bool enableVec = shouldEnableVectorizerAtOLevel(Args, false); + OptSpecifier vectorizeAliasOption = + enableVec ? options::OPT_O_Group : options::OPT_fvectorize; + if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption, + options::OPT_fno_vectorize, enableVec)) + CmdArgs.push_back("-vectorize-loops"); +} + +/// Enable -fslp-vectorize based on the optimization level selected. +void tools::handleVectorizeSLPArgs(const ArgList &Args, + ArgStringList &CmdArgs) { + bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); + OptSpecifier SLPVectAliasOption = + EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; + if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, + options::OPT_fno_slp_vectorize, EnableSLPVec)) + CmdArgs.push_back("-vectorize-slp"); +} diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 783a1f834b33d..cdf770e0564f7 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -267,6 +267,12 @@ void renderCommonIntegerOverflowOptions(const llvm::opt::ArgList &Args, bool shouldEnableVectorizerAtOLevel(const llvm::opt::ArgList &Args, bool isSlpVec); + +void handleVectorizeLoopsArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + +void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); } // end namespace tools } // end namespace driver } // end namespace clang diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index bb89432d3e58c..a44513a83a2d7 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -151,23 +151,8 @@ void Flang::addCodegenOptions(const ArgList &Args, !stackArrays->getOption().matches(options::OPT_fno_stack_arrays)) CmdArgs.push_back("-fstack-arrays"); - // Enable vectorization per default according to the optimization level - // selected. For optimization levels that want vectorization we use the alias - // option to simplify the hasFlag logic. - bool enableVec = shouldEnableVectorizerAtOLevel(Args, false); - OptSpecifier vectorizeAliasOption = - enableVec ? options::OPT_O_Group : options::OPT_fvectorize; - if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption, - options::OPT_fno_vectorize, enableVec)) - CmdArgs.push_back("-vectorize-loops"); - - // -fslp-vectorize is enabled based on the optimization level selected. - bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); - OptSpecifier SLPVectAliasOption = - EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; - if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, - options::OPT_fno_slp_vectorize, EnableSLPVec)) - CmdArgs.push_back("-vectorize-slp"); + handleVectorizeLoopsArgs(Args, CmdArgs); + handleVectorizeSLPArgs(Args, CmdArgs); if (shouldLoopVersion(Args)) CmdArgs.push_back("-fversion-loops-for-stride"); diff --git a/flang/test/Driver/slp-vectorize.f90 b/flang/test/Driver/slp-vectorize.f90 index 55d4be1a13c71..65a6d6e443742 100644 --- a/flang/test/Driver/slp-vectorize.f90 +++ b/flang/test/Driver/slp-vectorize.f90 @@ -1,10 +1,15 @@ ! RUN: %flang -### -S -fslp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s ! RUN: %flang -### -S -fno-slp-vectorize %s 2>&1 | FileCheck -check-prefix=CHECK-NO-SLP-VECTORIZE %s +! RUN: %flang -### -S -O0 %s 2>&1 | FileCheck -check-prefix=CHECK-NO-SLP-VECTORIZE %s ! RUN: %flang -### -S -O1 %s 2>&1 | FileCheck -check-prefix=CHECK-NO-SLP-VECTORIZE %s ! RUN: %flang -### -S -O2 %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s ! RUN: %flang -### -S -O3 %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! RUN: %flang -### -S -Os %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! RUN: %flang -### -S -Oz %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZE %s +! RUN: %flang_fc1 -emit-llvm -O2 -vectorize-slp -mllvm -print-pipeline-passes %s 2>&1 | FileCheck -check-prefix=CHECK-SLP-VECTORIZER %s ! CHECK-SLP-VECTORIZE: "-vectorize-slp" ! CHECK-NO-SLP-VECTORIZE-NOT: "-no-vectorize-slp" +! CHECK-SLP-VECTORIZER: slp-vectorizer program test end program >From 610ccf4b09ce87d8021c5c183f5376bc99af7db7 Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski <kajetan.puchal...@tuta.io> Date: Tue, 25 Mar 2025 14:09:19 +0000 Subject: [PATCH 3/4] [clang] CommonArgs - Fix local variable name case Co-authored-by: Tarun Prabhu <tarunpra...@gmail.com> --- clang/lib/Driver/ToolChains/CommonArgs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 29c78f874d206..b6934f9b79e00 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -3181,7 +3181,7 @@ bool tools::shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { /// Enable -fvectorize based on the optimization level selected. void tools::handleVectorizeLoopsArgs(const ArgList &Args, ArgStringList &CmdArgs) { - bool enableVec = shouldEnableVectorizerAtOLevel(Args, false); + bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false); OptSpecifier vectorizeAliasOption = enableVec ? options::OPT_O_Group : options::OPT_fvectorize; if (Args.hasFlag(options::OPT_fvectorize, vectorizeAliasOption, >From a9b7ccb8e73a70c7185298f79a84e2bff65188ef Mon Sep 17 00:00:00 2001 From: Kajetan Puchalski <kajetan.puchal...@tuta.io> Date: Tue, 25 Mar 2025 14:10:43 +0000 Subject: [PATCH 4/4] [clang] CommonArgs - Fix local variable name case Co-authored-by: Tarun Prabhu <tarunpra...@gmail.com> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits