[clang] 8564e2f - [Inlining] Add a clang option to limit inlining of functions
Wolfgang Pieb via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 18 11:56:52 PDT 2022
Author: Wolfgang Pieb
Date: 2022-08-18T11:56:24-07:00
New Revision: 8564e2fea559c58fecab3c7c01acf498bbe7820a
URL: https://github.com/llvm/llvm-project/commit/8564e2fea559c58fecab3c7c01acf498bbe7820a
DIFF: https://github.com/llvm/llvm-project/commit/8564e2fea559c58fecab3c7c01acf498bbe7820a.diff
LOG: [Inlining] Add a clang option to limit inlining of functions
Add the clang option -finline-max-stacksize=<N> to suppress inlining
of functions whose stack size exceeds the given value.
Reviewed By: aeubanks
Differential Revision: https://reviews.llvm.org/D131986
Added:
clang/test/CodeGen/inline-stacksize.c
Modified:
clang/docs/ClangCommandLineReference.rst
clang/include/clang/Basic/CodeGenOptions.def
clang/include/clang/Driver/Options.td
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/Driver/ToolChains/Clang.cpp
Removed:
################################################################################
diff --git a/clang/docs/ClangCommandLineReference.rst b/clang/docs/ClangCommandLineReference.rst
index da95d66a66e7d..265a6d7beb6e9 100644
--- a/clang/docs/ClangCommandLineReference.rst
+++ b/clang/docs/ClangCommandLineReference.rst
@@ -945,6 +945,10 @@ Inline suitable functions
Inline functions which are (explicitly or implicitly) marked inline
+.. option:: -finline-max-stacksize=<arg>
+
+Suppress inlining of functions with a stacksize larger than <arg> bytes.
+
.. option:: -fno-legacy-pass-manager, -fexperimental-new-pass-manager
.. option:: -fno-sanitize-ignorelist, -fno-sanitize-blacklist
diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def
index 1d322814f6ee3..0f35420f43133 100644
--- a/clang/include/clang/Basic/CodeGenOptions.def
+++ b/clang/include/clang/Basic/CodeGenOptions.def
@@ -399,6 +399,9 @@ CODEGENOPT(CodeViewGHash, 1, 0)
/// The kind of inlining to perform.
ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NormalInlining)
+/// The maximum stack size a function can have to be considered for inlining.
+VALUE_CODEGENOPT(InlineMaxStackSize, 32, UINT_MAX)
+
// Vector functions library to use.
ENUM_CODEGENOPT(VecLib, VectorLibrary, 3, NoLibrary)
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 8c9901d086eee..7c91b91eeddf4 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1985,6 +1985,11 @@ def finline_functions : Flag<["-"], "finline-functions">, Group<f_clang_Group>,
def finline_hint_functions: Flag<["-"], "finline-hint-functions">, Group<f_clang_Group>, Flags<[CC1Option]>,
HelpText<"Inline functions which are (explicitly or implicitly) marked inline">;
def finline : Flag<["-"], "finline">, Group<clang_ignored_f_Group>;
+def finline_max_stacksize_EQ
+ : Joined<["-"], "finline-max-stacksize=">,
+ Group<f_Group>, Flags<[CoreOption, CC1Option]>,
+ HelpText<"Suppress inlining of functions whose stack size exceeds the given value">,
+ MarshallingInfoInt<CodeGenOpts<"InlineMaxStackSize">, "UINT_MAX">;
defm jmc : BoolFOption<"jmc",
CodeGenOpts<"JMCInstrument">, DefaultFalse,
PosFlag<SetTrue, [CC1Option], "Enable just-my-code debugging">,
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 0921008e254c3..639285540c0a6 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -2372,6 +2372,9 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
if (getLangOpts().OpenMP && FD->hasAttr<OMPDeclareSimdDeclAttr>())
getOpenMPRuntime().emitDeclareSimdFunction(FD, F);
+ if (CodeGenOpts.InlineMaxStackSize != UINT_MAX)
+ F->addFnAttr("inline-max-stacksize", llvm::utostr(CodeGenOpts.InlineMaxStackSize));
+
if (const auto *CB = FD->getAttr<CallbackAttr>()) {
// Annotate the callback behavior as metadata:
// - The callback callee (as argument number).
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 69e6e63839093..57cbdffbe838a 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6592,6 +6592,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
InlineArg->render(Args, CmdArgs);
}
+ Args.AddLastArg(CmdArgs, options::OPT_finline_max_stacksize_EQ);
+
// FIXME: Find a better way to determine whether the language has modules
// support by default, or just assume that all languages do.
bool HaveModules =
diff --git a/clang/test/CodeGen/inline-stacksize.c b/clang/test/CodeGen/inline-stacksize.c
new file mode 100644
index 0000000000000..6aab158987d76
--- /dev/null
+++ b/clang/test/CodeGen/inline-stacksize.c
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -O2 -emit-llvm %s -o - | FileCheck %s --check-prefixes NOOPT
+// RUN: %clang_cc1 -O2 -finline-max-stacksize=64 -emit-llvm %s -o - | FileCheck %s --check-prefix OPT
+
+void foo() {}
+
+// NOOPT-NOT: inline-max-stacksize
+// OPT: define {{.*}}@foo{{.*}}#[[ATTR:[0-9]+]]
+// OPT: attributes #[[ATTR]] = {{.*}}"inline-max-stacksize"="64"
More information about the cfe-commits
mailing list