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

Reply via email to