Skip to content

Commit 31d4150

Browse files
authored
[TableGen] Change a reachable assert to a fatal error
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: #169439
1 parent 6ec6867 commit 31d4150

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// RUN: not llvm-tblgen -gen-asm-matcher -I %p/../../include %s -o - 2>&1 | FileCheck %s
2+
3+
include "llvm/Target/Target.td"
4+
5+
def Is32Bit : Predicate<"!Subtarget->is64Bit()">;
6+
def Is64Bit : Predicate<"Subtarget->is64Bit()">;
7+
defvar Ptr32 = DefaultMode;
8+
def Ptr64 : HwMode<[Is64Bit]>;
9+
10+
class MyReg<string n> : Register<n> {
11+
let Namespace = "MyTarget";
12+
}
13+
14+
def X0 : MyReg<"x0">;
15+
def X1 : MyReg<"x1">;
16+
def X2 : MyReg<"x2">;
17+
def X3 : MyReg<"x3">;
18+
19+
def XLenVT : ValueTypeByHwMode<[Ptr32, Ptr64], [i32, i64]>;
20+
def XLenRI : RegInfoByHwMode<[Ptr32, Ptr64],
21+
[RegInfo<32,32,32>, RegInfo<64,64,64>]>;
22+
23+
def XRegs : RegisterClass<"MyTarget", [XLenVT], 32, (add X0, X1, X2, X3)> {
24+
// Note: Would need this to determine size, otherwise we get an error.
25+
// let RegInfos = XLenRI;
26+
}
27+
// CHECK: [[#@LINE-4]]:5: error: Impossible to determine register size
28+
29+
def MyTargetISA : InstrInfo;
30+
def MyTarget : Target { let InstructionSet = MyTargetISA; }

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -734,8 +734,8 @@ CodeGenRegisterClass::CodeGenRegisterClass(CodeGenRegBank &RegBank,
734734
if (const Record *RV = R->getValueAsOptionalDef("RegInfos"))
735735
RSI = RegSizeInfoByHwMode(RV, RegBank.getHwModes());
736736
unsigned Size = R->getValueAsInt("Size");
737-
assert((RSI.hasDefault() || Size != 0 || VTs[0].isSimple()) &&
738-
"Impossible to determine register size");
737+
if (!RSI.hasDefault() && Size == 0 && !VTs[0].isSimple())
738+
PrintFatalError(R->getLoc(), "Impossible to determine register size");
739739
if (!RSI.hasDefault()) {
740740
RegSizeInfo RI;
741741
RI.RegSize = RI.SpillSize =

0 commit comments

Comments
 (0)