aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
diff options
context:
space:
mode:
authorNoah Goldstein <goldstein.w.n@gmail.com>2024-07-29 20:02:28 +0800
committerNoah Goldstein <goldstein.w.n@gmail.com>2024-07-30 00:56:53 +0800
commit67fb7c34f11df03ac359571dd4d503a36e06275e (patch)
treed16bc25882a6b1bd8bb616b6115e0a36db780a34 /llvm/lib/Transforms/Utils/BuildLibCalls.cpp
parente65882fec9689b2232575530bab0776d7c303dae (diff)
downloadllvm-67fb7c34f11df03ac359571dd4d503a36e06275e.zip
llvm-67fb7c34f11df03ac359571dd4d503a36e06275e.tar.gz
llvm-67fb7c34f11df03ac359571dd4d503a36e06275e.tar.bz2
[TLI] Add support for inferring attr `cold` on `exit`/`abort`
`abort` can be assumed always cold and assume non-zero `exit` status as a `cold` path as well. Closes #101003
Diffstat (limited to 'llvm/lib/Transforms/Utils/BuildLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/BuildLibCalls.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
index 0c45bd8..898e5b0 100644
--- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -48,6 +48,7 @@ STATISTIC(NumNoAlias, "Number of function returns inferred as noalias");
STATISTIC(NumNoUndef, "Number of function returns inferred as noundef returns");
STATISTIC(NumReturnedArg, "Number of arguments inferred as returned");
STATISTIC(NumWillReturn, "Number of functions inferred as willreturn");
+STATISTIC(NumCold, "Number of functions inferred as cold");
static bool setDoesNotAccessMemory(Function &F) {
if (F.doesNotAccessMemory())
@@ -57,6 +58,14 @@ static bool setDoesNotAccessMemory(Function &F) {
return true;
}
+static bool setIsCold(Function &F) {
+ if (F.hasFnAttribute(Attribute::Cold))
+ return false;
+ F.addFnAttr(Attribute::Cold);
+ ++NumCold;
+ return true;
+}
+
static bool setOnlyAccessesInaccessibleMemory(Function &F) {
if (F.onlyAccessesInaccessibleMemory())
return false;
@@ -1087,6 +1096,9 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
Changed |= setOnlyWritesMemory(F, 0);
Changed |= setDoesNotThrow(F);
break;
+ case LibFunc_abort:
+ Changed |= setIsCold(F);
+ break;
// int __nvvm_reflect(const char *)
case LibFunc_nvvm_reflect:
Changed |= setRetAndArgsNoUndef(F);