diff options
author | Snehasish Kumar <snehasishk@google.com> | 2024-08-15 08:06:41 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-15 08:06:41 -0700 |
commit | 95daf1aedfe521704c601a26ad8011c6e237c38a (patch) | |
tree | ef100af7330bae942dc1a373b63c76b185ce2ee2 /llvm/lib/Transforms/Utils/BuildLibCalls.cpp | |
parent | 56140a8258a3498cfcd9f0f05c182457d43cbfd2 (diff) | |
download | llvm-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.cpp | 51 |
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) { |