[llvm] [TableGen][DecoderEmitter] Avoid using a sentinel value (PR #153986)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 16 18:59:18 PDT 2025
================
@@ -0,0 +1,40 @@
+// RUN: llvm-tblgen -gen-disassembler -I %p/../../../include %s | FileCheck %s
+
+include "llvm/Target/Target.td"
+
+class I : Instruction {
+ let InOperandList = (ins);
+ let OutOperandList = (outs);
+ let Size = 16;
+ bits<128> Inst;
+}
+
+// Check that a 64-bit filter with all bits set does not confuse DecoderEmitter.
+//
+// CHECK-LABEL: static const uint8_t DecoderTable128[] = {
+// CHECK-NEXT: MCD::OPC_ExtractField, 0, 64,
+// CHECK-NEXT: MCD::OPC_FilterValue, 1, 8, 0,
+// CHECK-NEXT: MCD::OPC_CheckFieldOrFail, 127, 1, 1,
+// CHECK-NEXT: MCD::OPC_Decode, 187, 2, 0,
+// CHECK-NEXT: MCD::OPC_FilterValueOrFail, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1,
+// CHECK-NEXT: MCD::OPC_CheckFieldOrFail, 127, 1, 0,
+// CHECK-NEXT: MCD::OPC_Decode, 186, 2, 0,
+// CHECK-NEXT: MCD::OPC_Fail,
+// CHECK-NEXT: 0
+// CHECK-NEXT: };
----------------
s-barannikov wrote:
Old output:
```
static const uint8_t DecoderTable128[] = {
/* 0 */ MCD::OPC_ExtractField, 0, 64, // Inst{63-0} ...
/* 3 */ MCD::OPC_FilterValue, 1, 10, 0, // Skip to: 17
/* 7 */ MCD::OPC_CheckField, 127, 1, 1, 4, 0, // Skip to: 17
/* 13 */ MCD::OPC_Decode, 187, 2, 0, // Opcode: I2, DecodeIdx: 0
/* 17 */ MCD::OPC_CheckFieldOrFail, 127, 1, 0,
/* 21 */ MCD::OPC_Decode, 186, 2, 0, // Opcode: I1, DecodeIdx: 0
/* 25 */ MCD::OPC_Fail,
0
};
```
It decodes any instruction with `Inst{127} == 1 && Inst{63...0} != -1` as I1, which is wrong.
https://github.com/llvm/llvm-project/pull/153986
More information about the llvm-commits
mailing list