[llvm] ea4325f - [TableGen][DecoderEmitter] Improve conflicts dump (#154001)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 16 23:42:29 PDT 2025
Author: Sergei Barannikov
Date: 2025-08-17T06:42:25Z
New Revision: ea4325f174baca7d12e128db4f9f3b41a918da67
URL: https://github.com/llvm/llvm-project/commit/ea4325f174baca7d12e128db4f9f3b41a918da67
DIFF: https://github.com/llvm/llvm-project/commit/ea4325f174baca7d12e128db4f9f3b41a918da67.diff
LOG: [TableGen][DecoderEmitter] Improve conflicts dump (#154001)
* Print filter stack in non-reversed order.
* Print encoding name to the right of encoding bits to deal with
alignment issues.
* Use the correct bit width when printing encoding bits.
Example of old output:
```
01000100........
01000...........
0100............
................
tADDhirr 000000000000000001000100________
tADDrSP 000000000000000001000100_1101___
tADDspr 0000000000000000010001001____101
```
New output:
```
................
0100............
01000...........
01000100........
01000100________ tADDhirr
01000100_1101___ tADDrSP
010001001____101 tADDspr
```
Added:
Modified:
llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td
llvm/utils/TableGen/DecoderEmitter.cpp
Removed:
################################################################################
diff --git a/llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td b/llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td
index 7399ef726d0e2..853a68d22d1d9 100644
--- a/llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td
+++ b/llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td
@@ -29,7 +29,7 @@ def B : I<(outs GPR32:$dst), (ins GPR32:$src1), []> {
}
// CHECK: Decoding Conflict:
-// CHECK: 00000000000000000000000000000000
-// CHECK: ................................
-// CHECK: A 00000000000000000000000000000000
-// CHECK: B 00000000000000000000000000000000
+// CHECK: ................................
+// CHECK: 00000000000000000000000000000000
+// CHECK: 00000000000000000000000000000000 A
+// CHECK: 00000000000000000000000000000000 B
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index 6277e959574f9..11d06d1613e89 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -319,8 +319,8 @@ static raw_ostream &operator<<(raw_ostream &OS, const EncodingAndInst &Value) {
}
// Prints the bit value for each position.
-static void dumpBits(raw_ostream &OS, const BitsInit &Bits) {
- for (const Init *Bit : reverse(Bits.getBits()))
+static void dumpBits(raw_ostream &OS, const BitsInit &Bits, unsigned BitWidth) {
+ for (const Init *Bit : reverse(Bits.getBits().take_front(BitWidth)))
OS << BitValue(Bit);
}
@@ -389,16 +389,16 @@ class FilterChooser;
///
/// An example of a conflict is
///
-/// Conflict:
-/// 111101000.00........00010000....
-/// 111101000.00........0001........
-/// 1111010...00........0001........
-/// 1111010...00....................
-/// 1111010.........................
-/// 1111............................
-/// ................................
-/// VST4q8a 111101000_00________00010000____
-/// VST4q8b 111101000_00________00010000____
+/// Decoding Conflict:
+/// ................................
+/// 1111............................
+/// 1111010.........................
+/// 1111010...00....................
+/// 1111010...00........0001........
+/// 111101000.00........0001........
+/// 111101000.00........00010000....
+/// 111101000_00________00010000____ VST4q8a
+/// 111101000_00________00010000____ VST4q8b
///
/// The Debug output shows the path that the decoding tree follows to reach the
/// the conclusion that there is a conflict. VST4q8a is a vst4 to double-spaced
@@ -582,7 +582,7 @@ class FilterChooser {
/// dumpStack - dumpStack traverses the filter chooser chain and calls
/// dumpFilterArray on each filter chooser up to the top level one.
- void dumpStack(raw_ostream &OS, const char *prefix) const;
+ void dumpStack(raw_ostream &OS, indent Indent) const;
bool PositionFiltered(unsigned Idx) const {
return FilterBitValues[Idx].isSet();
@@ -701,9 +701,8 @@ void Filter::recurse() {
std::vector<BitValue> BitValueArray(Owner.FilterBitValues);
if (!VariableInstructions.empty()) {
- // Conservatively marks each segment position as BIT_UNSET.
for (unsigned bitIndex = 0; bitIndex < NumBits; ++bitIndex)
- BitValueArray[StartBit + bitIndex] = BitValue::BIT_UNSET;
+ BitValueArray[StartBit + bitIndex] = BitValue::BIT_UNFILTERED;
// Delegates to an inferior filter chooser for further processing on this
// group of instructions whose segment values are variable.
@@ -1118,15 +1117,12 @@ void FilterChooser::dumpFilterArray(raw_ostream &OS,
/// dumpStack - dumpStack traverses the filter chooser chain and calls
/// dumpFilterArray on each filter chooser up to the top level one.
-void FilterChooser::dumpStack(raw_ostream &OS, const char *prefix) const {
- const FilterChooser *current = this;
-
- while (current) {
- OS << prefix;
- dumpFilterArray(OS, current->FilterBitValues);
- OS << '\n';
- current = current->Parent;
- }
+void FilterChooser::dumpStack(raw_ostream &OS, indent Indent) const {
+ if (Parent)
+ Parent->dumpStack(OS, Indent);
+ OS << Indent;
+ dumpFilterArray(OS, FilterBitValues);
+ OS << '\n';
}
// Calculates the island(s) needed to decode the instruction.
@@ -1765,13 +1761,16 @@ void FilterChooser::doFilter() {
// Print out useful conflict information for postmortem analysis.
errs() << "Decoding Conflict:\n";
- dumpStack(errs(), "\t\t");
+ // Dump filters.
+ indent Indent(4);
+ dumpStack(errs(), Indent);
- for (auto Opcode : Opcodes) {
+ // Dump encodings.
+ for (EncodingIDAndOpcode Opcode : Opcodes) {
const EncodingAndInst &Enc = AllInstructions[Opcode.EncodingID];
- errs() << '\t' << Enc << ' ';
- dumpBits(errs(), getBitsField(*Enc.EncodingDef, "Inst"));
- errs() << '\n';
+ errs() << Indent;
+ dumpBits(errs(), getBitsField(*Enc.EncodingDef, "Inst"), BitWidth);
+ errs() << " " << Enc << '\n';
}
PrintFatalError("Decoding conflict encountered");
}
More information about the llvm-commits
mailing list