diff options
author | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-07-29 20:02:28 +0800 |
---|---|---|
committer | Noah Goldstein <goldstein.w.n@gmail.com> | 2024-07-30 00:56:53 +0800 |
commit | 67fb7c34f11df03ac359571dd4d503a36e06275e (patch) | |
tree | d16bc25882a6b1bd8bb616b6115e0a36db780a34 /llvm/lib/Transforms/Utils/BuildLibCalls.cpp | |
parent | e65882fec9689b2232575530bab0776d7c303dae (diff) | |
download | llvm-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.cpp | 12 |
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); |