[llvm] [ORC] Use SmallVector/SmallString for small hot paths (PR #148379)

Bogdan Vetrenko via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 12 09:02:47 PDT 2025


https://github.com/bv2k4 updated https://github.com/llvm/llvm-project/pull/148379

>From 64504bc4efa5b2789ef15d3aa029e3667079821e Mon Sep 17 00:00:00 2001
From: Bogdan Vetrenko <b.vetrenko at yandex.ru>
Date: Sat, 12 Jul 2025 18:35:45 +0300
Subject: [PATCH] [ORC] Use SmallVector/SmallString for small hot paths

---
 llvm/lib/ExecutionEngine/Orc/LLJIT.cpp | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
index 67bb7dd8ad08f..a8d1bfa26d227 100644
--- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
@@ -8,6 +8,8 @@
 
 #include "llvm/ExecutionEngine/Orc/LLJIT.h"
 
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/Config/llvm-config.h" // for LLVM_ENABLE_THREADS
 #include "llvm/ExecutionEngine/Orc/COFFPlatform.h"
@@ -55,7 +57,7 @@ Function *addHelperAndWrapper(Module &M, StringRef WrapperName,
                               GlobalValue::VisibilityTypes WrapperVisibility,
                               StringRef HelperName,
                               ArrayRef<Value *> HelperPrefixArgs) {
-  std::vector<Type *> HelperArgTypes;
+  SmallVector<Type *, 4> HelperArgTypes;
   for (auto *Arg : HelperPrefixArgs)
     HelperArgTypes.push_back(Arg->getType());
   llvm::append_range(HelperArgTypes, WrapperFnType->params());
@@ -71,7 +73,7 @@ Function *addHelperAndWrapper(Module &M, StringRef WrapperName,
   auto *EntryBlock = BasicBlock::Create(M.getContext(), "entry", WrapperFn);
   IRBuilder<> IB(EntryBlock);
 
-  std::vector<Value *> HelperArgs;
+  SmallVector<Value *, 4> HelperArgs;
   llvm::append_range(HelperArgs, HelperPrefixArgs);
   for (auto &Arg : WrapperFn->args())
     HelperArgs.push_back(&Arg);
@@ -320,7 +322,7 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
     if (!LookupResult)
       return LookupResult.takeError();
 
-    std::vector<ExecutorAddr> Initializers;
+    SmallVector<ExecutorAddr, 8> Initializers;
     while (!DFSLinkOrder.empty()) {
       auto &NextJD = *DFSLinkOrder.back();
       DFSLinkOrder.pop_back();
@@ -377,7 +379,7 @@ class GenericLLVMIRPlatformSupport : public LLJIT::PlatformSupport {
     if (!LookupResult)
       return LookupResult.takeError();
 
-    std::vector<ExecutorAddr> DeInitializers;
+    SmallVector<ExecutorAddr, 8> DeInitializers;
     for (auto &NextJD : DFSLinkOrder) {
       auto DeInitsItr = LookupResult->find(NextJD.get());
       assert(DeInitsItr != LookupResult->end() &&
@@ -518,13 +520,10 @@ GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM,
       // If there's no llvm.global_c/dtor or it's just a decl then skip.
       if (!GlobalCOrDtors || GlobalCOrDtors->isDeclaration())
         return Error::success();
-      std::string InitOrDeInitFunctionName;
-      if (isCtor)
-        raw_string_ostream(InitOrDeInitFunctionName)
-            << InitFunctionPrefix << M.getModuleIdentifier();
-      else
-        raw_string_ostream(InitOrDeInitFunctionName)
-            << DeInitFunctionPrefix << M.getModuleIdentifier();
+      SmallString<64> InitOrDeInitFunctionName;
+      raw_svector_ostream(InitOrDeInitFunctionName)
+          << (isCtor ? InitFunctionPrefix : DeInitFunctionPrefix)
+          << M.getModuleIdentifier();
 
       MangleAndInterner Mangle(PS.getExecutionSession(), M.getDataLayout());
       auto InternedInitOrDeInitName = Mangle(InitOrDeInitFunctionName);
@@ -536,7 +535,7 @@ GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM,
           FunctionType::get(Type::getVoidTy(Ctx), {}, false),
           GlobalValue::ExternalLinkage, InitOrDeInitFunctionName, &M);
       InitOrDeInitFunc->setVisibility(GlobalValue::HiddenVisibility);
-      std::vector<std::pair<Function *, unsigned>> InitsOrDeInits;
+      SmallVector<std::pair<Function *, unsigned>, 8> InitsOrDeInits;
       auto COrDtors = isCtor ? getConstructors(M) : getDestructors(M);
 
       for (auto E : COrDtors)



More information about the llvm-commits mailing list