https://github.com/ayushpareek2003 created https://github.com/llvm/llvm-project/pull/132287
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 1c09daa2979f8b6f2840979736e64d9d49541197 Mon Sep 17 00:00:00 2001 From: Ayush Pareek <ayushpareek1...@gmail.com> Date: Fri, 21 Mar 2025 02:33:00 +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 | 64 +++++++++++++------ 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp index d715ef874e002..576b27c6a1132 100644 --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -394,40 +394,62 @@ void ModuleDepCollector::addModuleMapFiles( 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 { - 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)}); + // Preallocation + if (Service.shouldEagerLoadModules()) { + CI.getMutFrontendOpts().ModuleFiles.reserve( + CI.getMutFrontendOpts().ModuleFiles.size() + ClangModuleDeps.size()); + } + for (const ModuleID &MID : ClangModuleDeps) { + if (ModuleDeps *MD = ModuleDepsByID.lookup(MID)) { + std::string PCMPath = + Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile); + + if (EagerLoad) { + CI.getMutFrontendOpts().ModuleFiles.emplace_back(std::move(PCMPath)); + } else { + CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.try_emplace( + MID.ModuleName, std::move(PCMPath)); + } + } } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits