Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions llvm/test/TableGen/FixedLenDecoderEmitter/conflict.td
Original file line number Diff line number Diff line change
Expand Up @@ -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
57 changes: 28 additions & 29 deletions llvm/utils/TableGen/DecoderEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -371,16 +371,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
Expand Down Expand Up @@ -573,7 +573,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();
Expand Down Expand Up @@ -692,9 +692,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.
Expand Down Expand Up @@ -1131,15 +1130,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.
Expand Down Expand Up @@ -1778,13 +1774,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");
}
Expand Down