diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/BuildLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index c23d53f..b0da198 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -50,6 +50,7 @@ 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"); +STATISTIC(NumNoReturn, "Number of functions inferred as no return"); static bool setDoesNotAccessMemory(Function &F) { if (F.doesNotAccessMemory()) @@ -67,6 +68,14 @@ static bool setIsCold(Function &F) { return true; } +static bool setNoReturn(Function &F) { + if (F.hasFnAttribute(Attribute::NoReturn)) + return false; + F.addFnAttr(Attribute::NoReturn); + ++NumNoReturn; + return true; +} + static bool setOnlyAccessesInaccessibleMemory(Function &F) { if (F.onlyAccessesInaccessibleMemory()) return false; @@ -1103,6 +1112,15 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F, case LibFunc_abort: Changed |= setIsCold(F); break; + case LibFunc_terminate: + Changed |= setIsCold(F); + Changed |= setNoReturn(F); + break; + case LibFunc_cxa_throw: + Changed |= setIsCold(F); + Changed |= setNoReturn(F); + // Don't add `nofree` on `__cxa_throw` + return Changed; // int __nvvm_reflect(const char *) case LibFunc_nvvm_reflect: Changed |= setRetAndArgsNoUndef(F); |