-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang][FatLTO][UnifiedLTO] Pass -enable-matrix to the LTO driver #77829
Conversation
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-driver Author: Matthew Voss (ormris) ChangesUnified LTO and Fat LTO do not use the regular LTO prelink pipeline when -flto/-flto=full is specified on the command line, thus they require LowerMatrixIntrinsicsPass to be run during the link stage. To enable this, we pass -enable-matrix to the LTO driver, replicating ThinLTO behavior. This fixes #77621. Full diff: https://github.com/llvm/llvm-project/pull/77829.diff 2 Files Affected:
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 2340191ca97d98..385f66f3782bc1 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -736,6 +736,8 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
const bool IsAMDGCN = ToolChain.getTriple().isAMDGCN();
const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
const Driver &D = ToolChain.getDriver();
+ const bool IsFatLTO = Args.hasArg(options::OPT_ffat_lto_objects);
+ const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
if (llvm::sys::path::filename(Linker) != "ld.lld" &&
llvm::sys::path::stem(Linker) != "ld.lld" &&
!ToolChain.getTriple().isOSOpenBSD()) {
@@ -765,7 +767,7 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
} else {
// Tell LLD to find and use .llvm.lto section in regular relocatable object
// files
- if (Args.hasArg(options::OPT_ffat_lto_objects))
+ if (IsFatLTO)
CmdArgs.push_back("--fat-lto-objects");
}
@@ -825,7 +827,8 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
// Matrix intrinsic lowering happens at link time with ThinLTO. Enable
// LowerMatrixIntrinsicsPass, which is transitively called by
// buildThinLTODefaultPipeline under EnableMatrix.
- if (IsThinLTO && Args.hasArg(options::OPT_fenable_matrix))
+ if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
+ Args.hasArg(options::OPT_fenable_matrix))
CmdArgs.push_back(
Args.MakeArgString(Twine(PluginOptPrefix) + "-enable-matrix"));
diff --git a/clang/test/Driver/matrix.c b/clang/test/Driver/matrix.c
index 15b44ce5a4ec15..4d2624ad39c16e 100644
--- a/clang/test/Driver/matrix.c
+++ b/clang/test/Driver/matrix.c
@@ -6,3 +6,15 @@
// RUN: %clang -flto=thin -fenable-matrix %t.o -### --target=x86_64-unknown-linux 2>&1 \
// RUN: | FileCheck %s -check-prefix=CHECK-THINLTO-MATRIX
// CHECK-THINLTO-MATRIX: "-plugin-opt=-enable-matrix"
+
+// RUN: %clang -flto -ffat-lto-objects -fenable-matrix %t.o -### --target=x86_64-unknown-linux 2>&1 \
+// RUN: | FileCheck %s -check-prefix=CHECK-THINLTO-MATRIX
+
+// RUN: %clang -flto=thin -ffat-lto-objects -fenable-matrix %t.o -### --target=x86_64-unknown-linux 2>&1 \
+// RUN: | FileCheck %s -check-prefix=CHECK-THINLTO-MATRIX
+
+// RUN: %clang -flto -funified-lto -fenable-matrix %t.o -### --target=x86_64-unknown-linux 2>&1 \
+// RUN: | FileCheck %s -check-prefix=CHECK-THINLTO-MATRIX
+
+// RUN: %clang -flto=thin -funified-lto -fenable-matrix %t.o -### --target=x86_64-unknown-linux 2>&1 \
+// RUN: | FileCheck %s -check-prefix=CHECK-THINLTO-MATRIX
|
You can test this locally with the following command:git-clang-format --diff 2bb511e277e501d3faa0f2da0d1c98ea0b515507 b8d3ec5cde2b311747aec83d316af370202b37c1 -- clang/lib/Driver/ToolChains/CommonArgs.cpp clang/test/Driver/matrix.c View the diff from clang-format here.diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 385f66f378..6305085087 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -828,7 +828,7 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
// LowerMatrixIntrinsicsPass, which is transitively called by
// buildThinLTODefaultPipeline under EnableMatrix.
if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
- Args.hasArg(options::OPT_fenable_matrix))
+ Args.hasArg(options::OPT_fenable_matrix))
CmdArgs.push_back(
Args.MakeArgString(Twine(PluginOptPrefix) + "-enable-matrix"));
|
The description should mention https://reviews.llvm.org/D153583 ("[ThinLTO][Matrix] Forward -enable-matrix flag to the LTO plugin"). I think this is correct when used in the ThinLTO mode, but it's not clear whether regular LTO mode is correct (perhaps correct but redundant). |
Thanks! I'll make sure to include that review in the commit message. Unified LTO is using the ThinLTO pre-link pipeline, regardless of what's passed to the driver. Since the ThinLTO pre-link pipeline doesn't provide this pass, this option should be required when Unified LTO is used. |
4f3d447
to
b8d3ec5
Compare
Unified LTO and Fat LTO do not use the regular LTO prelink pipeline when -flto/-flto=full is specified on the command line, thus they require LowerMatrixIntrinsicsPass to be run during the link stage. To enable this, we pass -enable-matrix to the LTO driver, replicating ThinLTO behavior. This fix was applied to ThinLTO in https://reviews.llvm.org/D153583. This fixes llvm#77621.
b8d3ec5
to
f626b1f
Compare
Unified LTO and Fat LTO do not use the regular LTO prelink pipeline when -flto/-flto=full is specified on the command line, thus they require LowerMatrixIntrinsicsPass to be run during the link stage. To enable this, we pass -enable-matrix to the LTO driver, replicating ThinLTO behavior.
This fixes #77621.