[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