aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
diff options
context:
space:
mode:
authorSnehasish Kumar <snehasishk@google.com>2024-08-15 08:06:41 -0700
committerGitHub <noreply@github.com>2024-08-15 08:06:41 -0700
commit95daf1aedfe521704c601a26ad8011c6e237c38a (patch)
treeef100af7330bae942dc1a373b63c76b185ce2ee2 /llvm/lib/Transforms/Utils/BuildLibCalls.cpp
parent56140a8258a3498cfcd9f0f05c182457d43cbfd2 (diff)
downloadllvm-95daf1aedfe521704c601a26ad8011c6e237c38a.zip
llvm-95daf1aedfe521704c601a26ad8011c6e237c38a.tar.gz
llvm-95daf1aedfe521704c601a26ad8011c6e237c38a.tar.bz2
Allow optimization of __size_returning_new variants. (#102258)
https://github.com/llvm/llvm-project/pull/101564 added support to TLI to detect variants of operator new which provide feedback on the actual size of memory allocated (http://wg21.link/P0901R5). This patch extends SimplifyLibCalls to handle hot cold hinting of these variants.
Diffstat (limited to 'llvm/lib/Transforms/Utils/BuildLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/BuildLibCalls.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
index 30a343b..c23d53f 100644
--- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -19,6 +19,7 @@
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
@@ -1963,6 +1964,56 @@ Value *llvm::emitCalloc(Value *Num, Value *Size, IRBuilderBase &B,
return CI;
}
+Value *llvm::emitHotColdSizeReturningNew(Value *Num, IRBuilderBase &B,
+ const TargetLibraryInfo *TLI,
+ LibFunc SizeFeedbackNewFunc,
+ uint8_t HotCold) {
+ Module *M = B.GetInsertBlock()->getModule();
+ if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
+ return nullptr;
+
+ StringRef Name = TLI->getName(SizeFeedbackNewFunc);
+
+ // __sized_ptr_t struct return type { void*, size_t }
+ StructType *SizedPtrT =
+ StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
+ FunctionCallee Func =
+ M->getOrInsertFunction(Name, SizedPtrT, Num->getType(), B.getInt8Ty());
+ inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
+ CallInst *CI = B.CreateCall(Func, {Num, B.getInt8(HotCold)}, "sized_ptr");
+
+ if (const Function *F = dyn_cast<Function>(Func.getCallee()))
+ CI->setCallingConv(F->getCallingConv());
+
+ return CI;
+}
+
+Value *llvm::emitHotColdSizeReturningNewAligned(Value *Num, Value *Align,
+ IRBuilderBase &B,
+ const TargetLibraryInfo *TLI,
+ LibFunc SizeFeedbackNewFunc,
+ uint8_t HotCold) {
+ Module *M = B.GetInsertBlock()->getModule();
+ if (!isLibFuncEmittable(M, TLI, SizeFeedbackNewFunc))
+ return nullptr;
+
+ StringRef Name = TLI->getName(SizeFeedbackNewFunc);
+
+ // __sized_ptr_t struct return type { void*, size_t }
+ StructType *SizedPtrT =
+ StructType::get(M->getContext(), {B.getPtrTy(), Num->getType()});
+ FunctionCallee Func = M->getOrInsertFunction(Name, SizedPtrT, Num->getType(),
+ Align->getType(), B.getInt8Ty());
+ inferNonMandatoryLibFuncAttrs(M, Name, *TLI);
+ CallInst *CI =
+ B.CreateCall(Func, {Num, Align, B.getInt8(HotCold)}, "sized_ptr");
+
+ if (const Function *F = dyn_cast<Function>(Func.getCallee()))
+ CI->setCallingConv(F->getCallingConv());
+
+ return CI;
+}
+
Value *llvm::emitHotColdNew(Value *Num, IRBuilderBase &B,
const TargetLibraryInfo *TLI, LibFunc NewFunc,
uint8_t HotCold) {