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/SimplifyLibCalls.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/SimplifyLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 673cc1a..be4d459 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -18,6 +18,7 @@ #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/Loads.h" #include "llvm/Analysis/OptimizationRemarkEmitter.h" +#include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/AttributeMask.h" #include "llvm/IR/DataLayout.h" @@ -1745,7 +1746,7 @@ Value *LibCallSimplifier::optimizeNew(CallInst *CI, IRBuilderBase &B, // if cold or hot, and leave as-is for default handling if "notcold" aka warm. // Note that in cases where we decide it is "notcold", it might be slightly // better to replace the hinted call with a non hinted call, to avoid the - // extra paramter and the if condition check of the hint value in the + // extra parameter and the if condition check of the hint value in the // allocator. This can be considered in the future. switch (Func) { case LibFunc_Znwm12__hot_cold_t: @@ -1844,6 +1845,30 @@ Value *LibCallSimplifier::optimizeNew(CallInst *CI, IRBuilderBase &B, TLI, LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t, HotCold); break; + case LibFunc_size_returning_new: + if (HotCold != NotColdNewHintValue) + return emitHotColdSizeReturningNew(CI->getArgOperand(0), B, TLI, + LibFunc_size_returning_new_hot_cold, + HotCold); + break; + case LibFunc_size_returning_new_hot_cold: + if (OptimizeExistingHotColdNew) + return emitHotColdSizeReturningNew(CI->getArgOperand(0), B, TLI, + LibFunc_size_returning_new_hot_cold, + HotCold); + break; + case LibFunc_size_returning_new_aligned: + if (HotCold != NotColdNewHintValue) + return emitHotColdSizeReturningNewAligned( + CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, + LibFunc_size_returning_new_aligned_hot_cold, HotCold); + break; + case LibFunc_size_returning_new_aligned_hot_cold: + if (OptimizeExistingHotColdNew) + return emitHotColdSizeReturningNewAligned( + CI->getArgOperand(0), CI->getArgOperand(1), B, TLI, + LibFunc_size_returning_new_aligned_hot_cold, HotCold); + break; default: return nullptr; } @@ -3759,6 +3784,7 @@ Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, Module *M = CI->getModule(); LibFunc Func; Function *Callee = CI->getCalledFunction(); + // Check for string/memory library functions. if (TLI->getLibFunc(*Callee, Func) && isLibFuncEmittable(M, TLI, Func)) { // Make sure we never change the calling convention. @@ -3851,6 +3877,10 @@ Value *LibCallSimplifier::optimizeStringMemoryLibCall(CallInst *CI, case LibFunc_ZnamRKSt9nothrow_t12__hot_cold_t: case LibFunc_ZnamSt11align_val_t12__hot_cold_t: case LibFunc_ZnamSt11align_val_tRKSt9nothrow_t12__hot_cold_t: + case LibFunc_size_returning_new: + case LibFunc_size_returning_new_hot_cold: + case LibFunc_size_returning_new_aligned: + case LibFunc_size_returning_new_aligned_hot_cold: return optimizeNew(CI, Builder, Func); default: break; |