[clang] [lld][LTO] Respect `-fno-slp-vectorize` for the LTO pipeline (PR #201585)
Joseph Huber via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 15 06:13:42 PDT 2026
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/201585
>From e474ff4e59e98e23dd0d694bab691b89df553d5b Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Thu, 4 Jun 2026 08:20:30 -0500
Subject: [PATCH] [lld][LTO] Respect `-fno-slp-vectorize` for the LTO pipeline
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 adds a few option to `lld` that suppresses SLP from being added
to the pipeline.
---
clang/lib/Driver/ToolChains/Clang.cpp | 4 +++-
clang/lib/Driver/ToolChains/CommonArgs.cpp | 9 +++++++++
clang/test/Driver/lto.c | 8 ++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index c2ac478d84929..76fe1ffaeb695 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -9591,7 +9591,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 2267d74ee7d58..31aa25a9f0d65 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..de2b0639082c0 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
More information about the cfe-commits
mailing list