aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/MemoryBuiltins.cpp
diff options
context:
space:
mode:
authorPhilip Reames <listmail@philipreames.com>2022-01-10 09:50:01 -0800
committerPhilip Reames <listmail@philipreames.com>2022-01-10 15:43:39 -0800
commit5265ac72c6686d73edcf5de37b019b64c814d00c (patch)
tree44b8376e7aad9a6250d9a6c3184d2830330b69b9 /llvm/lib/Analysis/MemoryBuiltins.cpp
parent38b30eb2b218ad481855d5c691ef4501711ca3a6 (diff)
downloadllvm-5265ac72c6686d73edcf5de37b019b64c814d00c.zip
llvm-5265ac72c6686d73edcf5de37b019b64c814d00c.tar.gz
llvm-5265ac72c6686d73edcf5de37b019b64c814d00c.tar.bz2
[MemoryBuiltin] Add an API for checking if an unused allocation can be removed [NFC]
Not all allocation functions are removable if unused. An example of a non-removable allocation would be a direct call to the replaceable global allocation function in C++. An example of a removable one - at least according to historical practice - would be malloc.
Diffstat (limited to 'llvm/lib/Analysis/MemoryBuiltins.cpp')
-rw-r--r--llvm/lib/Analysis/MemoryBuiltins.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/MemoryBuiltins.cpp b/llvm/lib/Analysis/MemoryBuiltins.cpp
index 213fdc5a..48c01fb 100644
--- a/llvm/lib/Analysis/MemoryBuiltins.cpp
+++ b/llvm/lib/Analysis/MemoryBuiltins.cpp
@@ -298,6 +298,17 @@ bool llvm::isStrdupLikeFn(const Value *V, const TargetLibraryInfo *TLI) {
return getAllocationData(V, StrDupLike, TLI).hasValue();
}
+bool llvm::isAllocRemovable(const CallBase *CB, const TargetLibraryInfo *TLI) {
+ assert(isAllocationFn(CB, TLI));
+
+ // Note: Removability is highly dependent on the source language. For
+ // example, recent C++ requires direct calls to the global allocation
+ // [basic.stc.dynamic.allocation] to be observable unless part of a new
+ // expression [expr.new paragraph 13].
+
+ // Historically we've treated the C family allocation routines as removable
+ return isAllocLikeFn(CB, TLI);
+}
Value *llvm::getAllocAlignment(const CallBase *V,
const TargetLibraryInfo *TLI) {