[llvm] TableGen: Replace assertion with error for unexpected pattern inputs (PR #159687)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 18 20:22:30 PDT 2025


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/159687

>From aea320c7f62004d0e163e99b978e40bfb59847cb Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 19 Sep 2025 10:41:07 +0900
Subject: [PATCH 1/3] TableGen: Replace assertion with error for unexpected
 pattern inputs

---
 .../test/TableGen/dag-pattern-crash-on-set.td | 25 +++++++++++++++++++
 .../TableGen/Common/CodeGenDAGPatterns.cpp    |  6 ++++-
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/TableGen/dag-pattern-crash-on-set.td

diff --git a/llvm/test/TableGen/dag-pattern-crash-on-set.td b/llvm/test/TableGen/dag-pattern-crash-on-set.td
new file mode 100644
index 0000000000000..dd273228033ff
--- /dev/null
+++ b/llvm/test/TableGen/dag-pattern-crash-on-set.td
@@ -0,0 +1,25 @@
+// RUN: not llvm-tblgen -gen-dag-isel -I %p/../../include -o /dev/null %s 2>&1 | FileCheck %s
+
+include "llvm/Target/Target.td"
+
+def MyTargetInstrInfo : InstrInfo;
+def MyTarget : Target {
+  let InstructionSet = MyTargetInstrInfo;
+}
+
+def R0 : Register<"r0">;
+def GPR : RegisterClass<"MyTarget", [i32], 32, (add R0)>;
+
+def LOAD : Instruction {
+  let Size = 2;
+  let OutOperandList = (outs GPR:$dst);
+  let InOperandList = (ins GPR:$addr);
+  let AsmString = "movimm $dst, $addr";
+}
+
+// CHECK: [[@LINE+1]]:5: error: In CrashPat: unknown node type 'set in input pattern
+def CrashPat : Pat <
+  (set R0, (load GPR:$addr)),
+  (LOAD $addr)
+>;
+
diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
index f1f7cd72ef9f2..08cf6ca1b8e3b 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
@@ -2795,7 +2795,11 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
     return MadeChange;
   }
 
-  assert(getOperator()->isSubClassOf("SDNodeXForm") && "Unknown node type!");
+  if (!getOperator()->isSubClassOf("SDNodeXForm")) {
+    TP.error("unknown node type '" + getOperator()->getName() +
+             " in input pattern");
+    return false;
+  }
 
   // Node transforms always take one operand.
   if (getNumChildren() != 1) {

>From be059b09f13a30b5cc838e76738b22c8e1399b52 Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 19 Sep 2025 12:22:16 +0900
Subject: [PATCH 2/3] Update CodeGenDAGPatterns.cpp

Co-authored-by: Sergei Barannikov <barannikov88 at gmail.com>
---
 llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
index 08cf6ca1b8e3b..37844663dfc33 100644
--- a/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenDAGPatterns.cpp
@@ -2797,7 +2797,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
 
   if (!getOperator()->isSubClassOf("SDNodeXForm")) {
     TP.error("unknown node type '" + getOperator()->getName() +
-             " in input pattern");
+             "' in input pattern");
     return false;
   }
 

>From 5cccaf99bffa3552f212c87995ffeac6e3ba451e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 19 Sep 2025 12:22:22 +0900
Subject: [PATCH 3/3] Update dag-pattern-crash-on-set.td

Co-authored-by: Sergei Barannikov <barannikov88 at gmail.com>
---
 llvm/test/TableGen/dag-pattern-crash-on-set.td | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/TableGen/dag-pattern-crash-on-set.td b/llvm/test/TableGen/dag-pattern-crash-on-set.td
index dd273228033ff..5b726a7ed958e 100644
--- a/llvm/test/TableGen/dag-pattern-crash-on-set.td
+++ b/llvm/test/TableGen/dag-pattern-crash-on-set.td
@@ -17,7 +17,7 @@ def LOAD : Instruction {
   let AsmString = "movimm $dst, $addr";
 }
 
-// CHECK: [[@LINE+1]]:5: error: In CrashPat: unknown node type 'set in input pattern
+// CHECK: [[@LINE+1]]:5: error: In CrashPat: unknown node type 'set' in input pattern
 def CrashPat : Pat <
   (set R0, (load GPR:$addr)),
   (LOAD $addr)



More information about the llvm-commits mailing list