https://github.com/joker-eph updated https://github.com/llvm/llvm-project/pull/223029
>From 7839d33136743d80b8f3129d285c12e4ebdb3f0f Mon Sep 17 00:00:00 2001 From: Mehdi Amini <[email protected]> Date: Thu, 10 Sep 2026 05:30:30 -0700 Subject: [PATCH] Cache the most recent diagnostic source file Avoid repeated ordered-map lookups while diagnostics remain in the same source file. Clear the cached map node whenever the map is reset. CTMark O0 (3 samples, CPU 6): 29.439800 s -> 29.312967 s (-0.431%). Impact on significant TUs in MLIR build time: - `mlir/lib/RegisterAllDialects.cpp`: 1.0930% fewer retired instructions. - `mlir/lib/Dialect/LLVMIR/IR/NVVMDialect.cpp`: 0.5034% fewer retired instructions. Assisted-by: Codex --- clang/include/clang/Basic/Diagnostic.h | 6 ++++++ clang/lib/Basic/Diagnostic.cpp | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index 834f026aff62d..06e1f454d058d 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -439,6 +439,7 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> { void clear(bool Soft) { // Just clear the cache when in soft mode. Files.clear(); + LastFile = nullptr; if (!Soft) { FirstDiagState = CurDiagState = nullptr; CurDiagStateLoc = SourceLocation(); @@ -497,6 +498,11 @@ class DiagnosticsEngine : public RefCountedBase<DiagnosticsEngine> { /// The diagnostic states for each file. mutable std::map<FileID, File> Files; + /// Cache the most recently accessed file. Diagnostic lookups commonly + /// stay within one source file for long runs. + mutable FileID LastFileID; + mutable File *LastFile = nullptr; + /// The initial diagnostic state. DiagState *FirstDiagState; diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 48dd9559ab8e6..d7795297ceff4 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -218,10 +218,15 @@ DiagnosticsEngine::DiagStateMap::File::lookup(unsigned Offset) const { DiagnosticsEngine::DiagStateMap::File * DiagnosticsEngine::DiagStateMap::getFile(SourceManager &SrcMgr, FileID ID) const { + if (LastFile && LastFileID == ID) + return LastFile; + // Get or insert the File for this ID. auto Range = Files.equal_range(ID); - if (Range.first != Range.second) - return &Range.first->second; + if (Range.first != Range.second) { + LastFileID = ID; + return LastFile = &Range.first->second; + } auto &F = Files.insert(Range.first, std::make_pair(ID, File()))->second; // We created a new File; look up the diagnostic state at the start of it and @@ -241,7 +246,8 @@ DiagnosticsEngine::DiagStateMap::getFile(SourceManager &SrcMgr, // end of isBeforeInTranslationUnit for the quirks it deals with. F.StateTransitions.push_back({FirstDiagState, 0}); } - return &F; + LastFileID = ID; + return LastFile = &F; } void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr, _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
