llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: Vitaly Buka (vitalybuka)

<details>
<summary>Changes</summary>

Currently SpecialCaseList created at least twice,
one on by `Driver`, for diagnostics only, and then
the real one by the `ASTContext`.

Also, deppending on enabled sanitizers, not all
sections will be used.

In both cases there is unnecessary RadixTree
construction.

This patch changes `GlobMatcher` to do initialization
lazily only when needed.

And remove empty one from `RegexMatcher`.

This saves saves 0.5% of clang time building large project.


---
Full diff: https://github.com/llvm/llvm-project/pull/167281.diff


1 Files Affected:

- (modified) llvm/lib/Support/SpecialCaseList.cpp (+18-27) 


``````````diff
diff --git a/llvm/lib/Support/SpecialCaseList.cpp 
b/llvm/lib/Support/SpecialCaseList.cpp
index 2ba53d63365d2..79032cbb07f3f 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -20,6 +20,7 @@
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/iterator_range.h"
+#include "llvm/Support/Compiler.h"
 #include "llvm/Support/GlobPattern.h"
 #include "llvm/Support/LineIterator.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -42,10 +43,9 @@ namespace {
 class RegexMatcher {
 public:
   Error insert(StringRef Pattern, unsigned LineNumber);
-  void preprocess();
-
   unsigned match(StringRef Query) const;
 
+private:
   struct Reg {
     Reg(StringRef Name, unsigned LineNo, Regex &&Rg)
         : Name(Name), LineNo(LineNo), Rg(std::move(Rg)) {}
@@ -60,10 +60,9 @@ class RegexMatcher {
 class GlobMatcher {
 public:
   Error insert(StringRef Pattern, unsigned LineNumber);
-  void preprocess();
-
   unsigned match(StringRef Query) const;
 
+private:
   struct Glob {
     Glob(StringRef Name, unsigned LineNo, GlobPattern &&Pattern)
         : Name(Name), LineNo(LineNo), Pattern(std::move(Pattern)) {}
@@ -72,15 +71,20 @@ class GlobMatcher {
     GlobPattern Pattern;
   };
 
+  void LazyInit() const;
+
   std::vector<GlobMatcher::Glob> Globs;
 
-  RadixTree<iterator_range<StringRef::const_iterator>,
-            RadixTree<iterator_range<StringRef::const_reverse_iterator>,
-                      SmallVector<int, 1>>>
+  mutable RadixTree<iterator_range<StringRef::const_iterator>,
+                    
RadixTree<iterator_range<StringRef::const_reverse_iterator>,
+                              SmallVector<int, 1>>>
       PrefixSuffixToGlob;
 
-  RadixTree<iterator_range<StringRef::const_iterator>, SmallVector<int, 1>>
+  mutable RadixTree<iterator_range<StringRef::const_iterator>,
+                    SmallVector<int, 1>>
       SubstrToGlob;
+
+  mutable bool Initialized = false;
 };
 
 /// Represents a set of patterns and their line numbers
@@ -89,7 +93,6 @@ class Matcher {
   Matcher(bool UseGlobs, bool RemoveDotSlash);
 
   Error insert(StringRef Pattern, unsigned LineNumber);
-  void preprocess();
   unsigned match(StringRef Query) const;
 
   bool matchAny(StringRef Query) const { return match(Query); }
@@ -122,8 +125,6 @@ Error RegexMatcher::insert(StringRef Pattern, unsigned 
LineNumber) {
   return Error::success();
 }
 
-void RegexMatcher::preprocess() {}
-
 unsigned RegexMatcher::match(StringRef Query) const {
   for (const auto &R : reverse(RegExes))
     if (R.Rg.match(Query))
@@ -142,7 +143,10 @@ Error GlobMatcher::insert(StringRef Pattern, unsigned 
LineNumber) {
   return Error::success();
 }
 
-void GlobMatcher::preprocess() {
+void GlobMatcher::LazyInit() const {
+  if (LLVM_LIKELY(Initialized))
+    return;
+  Initialized = true;
   for (const auto &[Idx, G] : enumerate(Globs)) {
     StringRef Prefix = G.Pattern.prefix();
     StringRef Suffix = G.Pattern.suffix();
@@ -167,6 +171,8 @@ void GlobMatcher::preprocess() {
 }
 
 unsigned GlobMatcher::match(StringRef Query) const {
+  LazyInit();
+
   int Best = -1;
   if (!PrefixSuffixToGlob.empty()) {
     for (const auto &[_, SToGlob] : PrefixSuffixToGlob.find_prefixes(Query)) {
@@ -224,10 +230,6 @@ Error Matcher::insert(StringRef Pattern, unsigned 
LineNumber) {
   return std::visit([&](auto &V) { return V.insert(Pattern, LineNumber); }, M);
 }
 
-void Matcher::preprocess() {
-  return std::visit([&](auto &V) { return V.preprocess(); }, M);
-}
-
 unsigned Matcher::match(StringRef Query) const {
   if (RemoveDotSlash)
     Query = llvm::sys::path::remove_leading_dotslash(Query);
@@ -237,7 +239,6 @@ unsigned Matcher::match(StringRef Query) const {
 
 class SpecialCaseList::Section::SectionImpl {
   friend class SpecialCaseList;
-  void preprocess();
   const Matcher *findMatcher(StringRef Prefix, StringRef Category) const;
 
 public:
@@ -410,9 +411,6 @@ bool SpecialCaseList::parse(unsigned FileIdx, const 
MemoryBuffer *MB,
     }
   }
 
-  for (Section &S : Sections)
-    S.Impl->preprocess();
-
   return true;
 }
 
@@ -462,13 +460,6 @@ 
SpecialCaseList::Section::SectionImpl::findMatcher(StringRef Prefix,
   return &II->second;
 }
 
-void SpecialCaseList::Section::SectionImpl::preprocess() {
-  SectionMatcher.preprocess();
-  for (auto &[K1, E] : Entries)
-    for (auto &[K2, M] : E)
-      M.preprocess();
-}
-
 unsigned SpecialCaseList::Section::getLastMatch(StringRef Prefix,
                                                 StringRef Query,
                                                 StringRef Category) const {

``````````

</details>


https://github.com/llvm/llvm-project/pull/167281
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to