[llvm-branch-commits] [llvm] TableGen: Match each instregex pattern only once (PR #235485)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sun Oct 25 09:42:37 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-tablegen

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

Scheduling models use the same instregex patterns many times, and every
use matched the pattern against the instruction names again. AArch64
evaluates 12501 patterns, only 4344 of them distinct, for a total of 34
million regex matches. Cache the instructions each pattern matches, so a
repeated pattern costs a lookup.

AArch64GenSubtargetInfo.inc tablegen run:

            Gigainstructions  Gigacycles      CPU seconds
  Before    67.9              31.1            9.4
  After     44.6 (-34.3%)     18.8 (-39.6%)   5.7 (-39.1%)

All 366 tablegen runs in an LLVM build with all targets:

            Gigainstructions  Gigacycles      CPU seconds
  Before    2252              1409            499
  After     2188 (-2.8%)      1380 (-2.1%)    489 (-1.9%)

Co-authored-by: Claude Opus 5.5 <noreply@<!-- -->anthropic.com>

---

<sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub>

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


1 Files Affected:

- (modified) llvm/utils/TableGen/Common/CodeGenSchedule.cpp (+17-11) 


``````````diff
diff --git a/llvm/utils/TableGen/Common/CodeGenSchedule.cpp b/llvm/utils/TableGen/Common/CodeGenSchedule.cpp
index 0a5fcc68b7bfc..f412663a11663 100644
--- a/llvm/utils/TableGen/Common/CodeGenSchedule.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenSchedule.cpp
@@ -52,6 +52,10 @@ struct InstrsOp : public SetTheory::Operator {
 // (instregex "OpcPat",...) Find all instructions matching an opcode pattern.
 struct InstRegexOp : public SetTheory::Operator {
   const CodeGenTarget &Target;
+  // The instructions matching each pattern. Scheduling models repeat many
+  // patterns, so only match each one once.
+  StringMap<std::vector<const Record *>> Matches;
+
   InstRegexOp(const CodeGenTarget &t) : Target(t) {}
 
   /// Remove any text inside of parentheses from S.
@@ -90,6 +94,13 @@ struct InstRegexOp : public SetTheory::Operator {
         PrintFatalError(Loc, "instregex requires pattern string: " +
                                  Expr->getAsString());
       StringRef Original = SI->getValue();
+      auto [It, Inserted] = Matches.try_emplace(Original);
+      std::vector<const Record *> &Matched = It->second;
+      if (!Inserted) {
+        Elts.insert(Matched.begin(), Matched.end());
+        continue;
+      }
+
       // Drop an explicit ^ anchor to not interfere with prefix search.
       bool HadAnchor = Original.consume_front("^");
 
@@ -130,16 +141,12 @@ struct InstRegexOp : public SetTheory::Operator {
         Regexpr = Regex(pat);
       }
 
-      int NumMatches = 0;
-
       // The generic opcodes are unsorted, handle them manually.
       for (auto *Inst : Generics) {
         StringRef InstName = Inst->getName();
         if (InstName.starts_with(Prefix) &&
-            (!Regexpr || Regexpr->match(InstName.substr(Prefix.size())))) {
-          Elts.insert(Inst->TheDef);
-          NumMatches++;
-        }
+            (!Regexpr || Regexpr->match(InstName.substr(Prefix.size()))))
+          Matched.push_back(Inst->TheDef);
       }
 
       // Target instructions are split into two ranges: pseudo instructions
@@ -162,16 +169,15 @@ struct InstRegexOp : public SetTheory::Operator {
       // Check if there's a regex that needs to be checked.
       const auto HandleNonGeneric = [&](const CodeGenInstruction *Inst) {
         StringRef InstName = Inst->getName();
-        if (!Regexpr || Regexpr->match(InstName.substr(Prefix.size()))) {
-          Elts.insert(Inst->TheDef);
-          NumMatches++;
-        }
+        if (!Regexpr || Regexpr->match(InstName.substr(Prefix.size())))
+          Matched.push_back(Inst->TheDef);
       };
       std::for_each(Range1.first, Range1.second, HandleNonGeneric);
       std::for_each(Range2.first, Range2.second, HandleNonGeneric);
 
-      if (0 == NumMatches)
+      if (Matched.empty())
         PrintFatalError(Loc, "instregex has no matches: " + Original);
+      Elts.insert(Matched.begin(), Matched.end());
     }
   }
 };

``````````

</details>


https://github.com/llvm/llvm-project/pull/235485


More information about the llvm-branch-commits mailing list