Author: Joseph Huber Date: 2026-06-19T08:59:04-05:00 New Revision: 12ee71c377db385c4af0cfe92488406b9a8fa13c
URL: https://github.com/llvm/llvm-project/commit/12ee71c377db385c4af0cfe92488406b9a8fa13c DIFF: https://github.com/llvm/llvm-project/commit/12ee71c377db385c4af0cfe92488406b9a8fa13c.diff LOG: [Clang] Respect `-fno-slp-vectorize` for the LTO pipeline (#201585) Summary: This is related to reported regressions in the GROMACS suite when offloading to AMDGCN devices through the RDC / LTO interface. The application intentionally passes `-fno-slp-vectorize` to disable that pass, but there's currently no way to do this through the LTO pipline. This PR causes the driver to emit `plugin-opt=` for the `-mllvm` option. That means the pass is still enabled but it should be a no-op now. Added: Modified: clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/Driver/lto.c Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index e3288c81d4c95..0cbb1f18809f7 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -9646,7 +9646,9 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, OPT_fsanitize_minimal_runtime, OPT_fno_sanitize_minimal_runtime, OPT_fsanitize_trap_EQ, - OPT_fno_sanitize_trap_EQ}; + OPT_fno_sanitize_trap_EQ, + OPT_fslp_vectorize, + OPT_fno_slp_vectorize}; const llvm::DenseSet<unsigned> LinkerOptions{OPT_mllvm, OPT_Zlinker_input}; auto ToolChainHasRT = [&](const ToolChain &TC, StringRef Name) { return TC.getVFS().exists( diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 48724746d9330..547405eaf7663 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1157,6 +1157,15 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ParallelismOpt + Parallelism)); + // Forward the SLP vectorization preference to the LTO backend by toggling + // the existing -vectorize-slp cl::opt, which the pass honors directly. This + // avoids minting dedicated linker options for what is only pipeline tuning. + if (Arg *A = Args.getLastArg(options::OPT_fslp_vectorize, + options::OPT_fno_slp_vectorize)) + CmdArgs.push_back(Args.MakeArgString( + Twine(PluginOptPrefix) + "-vectorize-slp=" + + (A->getOption().matches(options::OPT_fslp_vectorize) ? "1" : "0"))); + // Pass down GlobalISel options. if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel, options::OPT_fno_global_isel)) { diff --git a/clang/test/Driver/lto.c b/clang/test/Driver/lto.c index 81165d3b9e8a3..c9ee2f9c26223 100644 --- a/clang/test/Driver/lto.c +++ b/clang/test/Driver/lto.c @@ -117,6 +117,14 @@ // CHECK-GISEL: "-plugin-opt=-global-isel=1" // CHECK-DISABLE-GISEL: "-plugin-opt=-global-isel=0" +// RUN: %clang --target=x86_64-unknown-linux-gnu -### %s -flto -fno-slp-vectorize 2> %t +// RUN: FileCheck --check-prefix=CHECK-NO-SLP < %t %s +// RUN: %clang --target=x86_64-unknown-linux-gnu -### %s -flto -fslp-vectorize 2> %t +// RUN: FileCheck --check-prefix=CHECK-SLP < %t %s + +// CHECK-NO-SLP: "-plugin-opt=-vectorize-slp=0" +// CHECK-SLP: "-plugin-opt=-vectorize-slp=1" + // -flto passes -time-passes when -ftime-report is passed // RUN: %clang --target=x86_64-unknown-linux-gnu -### %s -flto -ftime-report 2> %t // RUN: FileCheck --check-prefix=CHECK-TIME-REPORT < %t %s _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
