Skip to content

Conversation

@arichardson
Copy link
Member

I hit this when using a RegisterClass with a ValueTypeByHwMode that
was missing the RegInfos field. Add a test for this error.

Created using spr 1.3.8-beta.1
@llvmbot
Copy link
Member

llvmbot commented Nov 25, 2025

@llvm/pr-subscribers-tablegen

Author: Alexander Richardson (arichardson)

Changes

I hit this when using a RegisterClass with a ValueTypeByHwMode that
was missing the RegInfos field. Add a test for this error.


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

2 Files Affected:

  • (added) llvm/test/TableGen/ValueTypeByHwModeMissingRegInfo.td (+30)
  • (modified) llvm/utils/TableGen/Common/CodeGenRegisters.cpp (+2-2)
diff --git a/llvm/test/TableGen/ValueTypeByHwModeMissingRegInfo.td b/llvm/test/TableGen/ValueTypeByHwModeMissingRegInfo.td
new file mode 100644
index 0000000000000..e34a7ffb8a4d3
--- /dev/null
+++ b/llvm/test/TableGen/ValueTypeByHwModeMissingRegInfo.td
@@ -0,0 +1,30 @@
+// RUN: not llvm-tblgen -gen-asm-matcher -I %p/../../include %s -o - 2>&1 | FileCheck %s
+
+include "llvm/Target/Target.td"
+
+def Is32Bit : Predicate<"!Subtarget->is64Bit()">;
+def Is64Bit : Predicate<"Subtarget->is64Bit()">;
+defvar Ptr32 = DefaultMode;
+def Ptr64 : HwMode<[Is64Bit]>;
+
+class MyReg<string n> : Register<n> {
+  let Namespace = "MyTarget";
+}
+
+def X0 : MyReg<"x0">;
+def X1 : MyReg<"x1">;
+def X2 : MyReg<"x2">;
+def X3 : MyReg<"x3">;
+
+def XLenVT : ValueTypeByHwMode<[Ptr32, Ptr64], [i32, i64]>;
+def XLenRI : RegInfoByHwMode<[Ptr32,             Ptr64],
+                             [RegInfo<32,32,32>, RegInfo<64,64,64>]>;
+
+def XRegs : RegisterClass<"MyTarget", [XLenVT], 32, (add X0, X1, X2, X3)> {
+  // Note: Would need this to determine size, otherwise we get an error.
+  // let RegInfos = XLenRI;
+}
+// CHECK: [[#@LINE-4]]:5: error: Impossible to determine register size
+
+def MyTargetISA : InstrInfo;
+def MyTarget : Target { let InstructionSet = MyTargetISA; }
diff --git a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
index 2f0ff3f59c47c..446163eb52772 100644
--- a/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
+++ b/llvm/utils/TableGen/Common/CodeGenRegisters.cpp
@@ -734,8 +734,8 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
   if (const Record *RV = R->getValueAsOptionalDef("RegInfos"))
     RSI = RegSizeInfoByHwMode(RV, RegBank.getHwModes());
   unsigned Size = R->getValueAsInt("Size");
-  assert((RSI.hasDefault() || Size != 0 || VTs[0].isSimple()) &&
-         "Impossible to determine register size");
+  if (!(RSI.hasDefault() || Size != 0 || VTs[0].isSimple()))
+    PrintFatalError(R->getLoc(), "Impossible to determine register size");
   if (!RSI.hasDefault()) {
     RegSizeInfo RI;
     RI.RegSize = RI.SpillSize =

Created using spr 1.3.8-beta.1
@arichardson arichardson merged commit 31d4150 into main Nov 25, 2025
5 of 9 checks passed
@arichardson arichardson deleted the users/arichardson/spr/tablegen-change-a-reachable-assert-to-a-fatal-error branch November 25, 2025 02:55
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Nov 25, 2025
I hit this when using a RegisterClass with a ValueTypeByHwMode that
was missing the RegInfos field. Add a test for this error.

Reviewed By: arsenm

Pull Request: llvm/llvm-project#169439
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants