[clang] Optimize Module Dependency Handling for Efficient Memory Usage (PR #132638)

Ayush Pareek via cfe-commits cfe-commits at lists.llvm.org
Sun Mar 23 15:03:56 PDT 2025


https://github.com/ayushpareek2003 created https://github.com/llvm/llvm-project/pull/132638

-Optimized addModuleFiles functions for both CompilerInvocation and CowCompilerInvocation to reduce redundant function calls and improve efficiency

-Introduced memory preallocation using reserve() when eager load is enabled to reduce reallocation overhead

-Used try_emplace() instead of insert() for PrebuiltModuleFiles to avoid unnecessary overwrites

>From ba67caab088be29018c17bfe47e3064db357788d Mon Sep 17 00:00:00 2001
From: Ayush Pareek <AYUSHPAREEK1980 at GMAIL.COM>
Date: Mon, 24 Mar 2025 03:33:31 +0530
Subject: [PATCH] Optimize Module Dependency Handling for Efficient Memory
 Usage

-Optimized addModuleFiles functions for both CompilerInvocation and CowCompilerInvocation to reduce redundant function calls and improve efficiency

-Introduced memory preallocation using reserve() when eager load is enabled to reduce reallocation overhead

-Used try_emplace() instead of insert() for PrebuiltModuleFiles to avoid unnecessary overwrites
---
 .../DependencyScanning/ModuleDepCollector.cpp | 60 ++++++++++++-------
 1 file changed, 38 insertions(+), 22 deletions(-)

diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index d715ef874e002..b8b646ffb6d09 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -393,41 +393,57 @@ void ModuleDepCollector::addModuleMapFiles(
     CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
   if (Service.shouldEagerLoadModules())
     return; // Only pcm is needed for eager load.
-
+   // Preallocate memory to avoid multiple allocations
+   CI.getFrontendOpts().ModuleMapFiles.reserve(
+       CI.getFrontendOpts().ModuleMapFiles.size() + ClangModuleDeps.size());
+ 
   for (const ModuleID &MID : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
-    assert(MD && "Inconsistent dependency info");
-    CI.getFrontendOpts().ModuleMapFiles.push_back(MD->ClangModuleMapFile);
+    if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) { // Single lookup
+       assert(MD && "Inconsistent dependency info");
+       CI.getFrontendOpts().ModuleMapFiles.emplace_back(MD->ClangModuleMapFile);
+     }
   }
 }
 
 void ModuleDepCollector::addModuleFiles(
     CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+    // Preallocate memory if eager load is enabled
+   if (Service.shouldEagerLoadModules()) {
+     CI.getFrontendOpts().ModuleFiles.reserve(
+         CI.getFrontendOpts().ModuleFiles.size() + ClangModuleDeps.size());
+   }
   for (const ModuleID &MID : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
-    std::string PCMPath =
-        Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
-
-    if (Service.shouldEagerLoadModules())
-      CI.getFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
-    else
-      CI.getHeaderSearchOpts().PrebuiltModuleFiles.insert(
-          {MID.ModuleName, std::move(PCMPath)});
+    if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) {  
+       std::string PCMPath =
+           Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
+       if (Service.shouldEagerLoadModules()) {
+         CI.getFrontendOpts().ModuleFiles.emplace_back(std::move(PCMPath));
+       } else {
+         CI.getHeaderSearchOpts().PrebuiltModuleFiles.try_emplace(
+             MID.ModuleName, std::move(PCMPath));
+       }
+    }
   }
 }
 
 void ModuleDepCollector::addModuleFiles(
     CowCompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const {
+      // Preallocation
+   if (Service.shouldEagerLoadModules()) {
+     CI.getMutFrontendOpts().ModuleFiles.reserve(
+         CI.getMutFrontendOpts().ModuleFiles.size() + ClangModuleDeps.size());
+   }
   for (const ModuleID &MID : ClangModuleDeps) {
-    ModuleDeps *MD = ModuleDepsByID.lookup(MID);
-    std::string PCMPath =
-        Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
-
-    if (Service.shouldEagerLoadModules())
-      CI.getMutFrontendOpts().ModuleFiles.push_back(std::move(PCMPath));
-    else
-      CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.insert(
-          {MID.ModuleName, std::move(PCMPath)});
+    if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) {  
+       std::string PCMPath =
+           Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile);
+       if (Service.shouldEagerLoadModules()) {
+         CI.getMutFrontendOpts().ModuleFiles.emplace_back(std::move(PCMPath));
+       } else {
+         CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.try_emplace(
+             MID.ModuleName, std::move(PCMPath));
+       }
+     }
   }
 }
 



More information about the cfe-commits mailing list