Skip to content

Commit 6d8bf3c

Browse files
authored
Revert "Reapply "[LLVM][TableGen] Parameterize NumToSkip in DecoderEmitter" (#136017)" (#136068)
Reverts #136019 Expensive checks tests are failing, so reverting.
1 parent 78671db commit 6d8bf3c

File tree

7 files changed

+68
-83
lines changed

7 files changed

+68
-83
lines changed

Diff for: llvm/lib/Target/AArch64/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ tablegen(LLVM AArch64GenAsmWriter.inc -gen-asm-writer)
77
tablegen(LLVM AArch64GenAsmWriter1.inc -gen-asm-writer -asmwriternum=1)
88
tablegen(LLVM AArch64GenCallingConv.inc -gen-callingconv)
99
tablegen(LLVM AArch64GenDAGISel.inc -gen-dag-isel)
10-
tablegen(LLVM AArch64GenDisassemblerTables.inc -gen-disassembler --num-to-skip-size=3)
10+
tablegen(LLVM AArch64GenDisassemblerTables.inc -gen-disassembler)
1111
tablegen(LLVM AArch64GenFastISel.inc -gen-fast-isel)
1212
tablegen(LLVM AArch64GenGlobalISel.inc -gen-global-isel)
1313
tablegen(LLVM AArch64GenO0PreLegalizeGICombiner.inc -gen-global-isel-combiner

Diff for: llvm/test/TableGen/VarLenDecoder.td

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ def FOO32 : MyVarInst<MemOp32> {
4747
}
4848

4949
// CHECK: MCD::OPC_ExtractField, 3, 5, // Inst{7-3} ...
50-
// CHECK-NEXT: MCD::OPC_FilterValue, 8, 4, 0, // Skip to: 11
50+
// CHECK-NEXT: MCD::OPC_FilterValue, 8, 4, 0, 0, // Skip to: 12
5151
// CHECK-NEXT: MCD::OPC_Decode, {{[0-9]+}}, {{[0-9]+}}, 0, // Opcode: FOO16
52-
// CHECK-NEXT: MCD::OPC_FilterValue, 9, 4, 0, // Skip to: 19
52+
// CHECK-NEXT: MCD::OPC_FilterValue, 9, 4, 0, 0, // Skip to: 21
5353
// CHECK-NEXT: MCD::OPC_Decode, {{[0-9]+}}, {{[0-9]+}}, 1, // Opcode: FOO32
5454
// CHECK-NEXT: MCD::OPC_Fail,
5555

Diff for: llvm/test/TableGen/trydecode-emission.td

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ def InstB : TestInstruction {
3434
}
3535

3636
// CHECK: /* 0 */ MCD::OPC_ExtractField, 4, 4, // Inst{7-4} ...
37-
// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 16, 0, // Skip to: 23
38-
// CHECK-NEXT: /* 7 */ MCD::OPC_CheckField, 2, 2, 0, 6, 0, // Skip to: 19
39-
// CHECK-NEXT: /* 13 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 0, 0, 0, // Opcode: InstB, skip to: 19
40-
// CHECK-NEXT: /* 19 */ MCD::OPC_Decode, {{[0-9]+}}, {{[0-9]+}}, 1, // Opcode: InstA
41-
// CHECK-NEXT: /* 23 */ MCD::OPC_Fail,
37+
// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 18, 0, 0, // Skip to: 26
38+
// CHECK-NEXT: /* 8 */ MCD::OPC_CheckField, 2, 2, 0, 7, 0, 0, // Skip to: 22
39+
// CHECK-NEXT: /* 15 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 0, 0, 0, 0, // Opcode: InstB, skip to: 22
40+
// CHECK-NEXT: /* 22 */ MCD::OPC_Decode, {{[0-9]+}}, {{[0-9]+}}, 1, // Opcode: InstA
41+
// CHECK-NEXT: /* 26 */ MCD::OPC_Fail,
4242

4343
// CHECK: if (!Check(S, DecodeInstB(MI, insn, Address, Decoder))) { DecodeComplete = false; return MCDisassembler::Fail; }

Diff for: llvm/test/TableGen/trydecode-emission2.td

+8-8
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ def InstB : TestInstruction {
3131
}
3232

3333
// CHECK: /* 0 */ MCD::OPC_ExtractField, 2, 1, // Inst{2} ...
34-
// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 31, 0, // Skip to: 38
35-
// CHECK-NEXT: /* 7 */ MCD::OPC_ExtractField, 5, 3, // Inst{7-5} ...
36-
// CHECK-NEXT: /* 10 */ MCD::OPC_FilterValue, 0, 24, 0, // Skip to: 38
37-
// CHECK-NEXT: /* 14 */ MCD::OPC_CheckField, 0, 2, 3, 6, 0, // Skip to: 26
38-
// CHECK-NEXT: /* 20 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 0, 0, 0, // Opcode: InstB, skip to: 26
39-
// CHECK-NEXT: /* 26 */ MCD::OPC_CheckField, 3, 2, 0, 6, 0, // Skip to: 38
40-
// CHECK-NEXT: /* 32 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 1, 0, 0, // Opcode: InstA, skip to: 38
41-
// CHECK-NEXT: /* 38 */ MCD::OPC_Fail,
34+
// CHECK-NEXT: /* 3 */ MCD::OPC_FilterValue, 0, 36, 0, 0, // Skip to: 44
35+
// CHECK-NEXT: /* 8 */ MCD::OPC_ExtractField, 5, 3, // Inst{7-5} ...
36+
// CHECK-NEXT: /* 11 */ MCD::OPC_FilterValue, 0, 28, 0, 0, // Skip to: 44
37+
// CHECK-NEXT: /* 16 */ MCD::OPC_CheckField, 0, 2, 3, 7, 0, 0, // Skip to: 30
38+
// CHECK-NEXT: /* 23 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 0, 0, 0, 0, // Opcode: InstB, skip to: 30
39+
// CHECK-NEXT: /* 30 */ MCD::OPC_CheckField, 3, 2, 0, 7, 0, 0, // Skip to: 44
40+
// CHECK-NEXT: /* 37 */ MCD::OPC_TryDecode, {{[0-9]+}}, {{[0-9]+}}, 1, 0, 0, 0, // Opcode: InstA, skip to: 44
41+
// CHECK-NEXT: /* 44 */ MCD::OPC_Fail,
4242

4343
// CHECK: if (!Check(S, DecodeInstB(MI, insn, Address, Decoder))) { DecodeComplete = false; return MCDisassembler::Fail; }
4444
// CHECK: if (!Check(S, DecodeInstA(MI, insn, Address, Decoder))) { DecodeComplete = false; return MCDisassembler::Fail; }

Diff for: llvm/test/TableGen/trydecode-emission3.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: llvm-tblgen -gen-disassembler --num-to-skip-size=3 -I %p/../../include %s | FileCheck %s
1+
// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s
22

33
include "llvm/Target/Target.td"
44

Diff for: llvm/test/TableGen/trydecode-emission4.td

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: llvm-tblgen -gen-disassembler --num-to-skip-size=3 -I %p/../../include %s | FileCheck %s
1+
// RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s
22

33
// Test for OPC_ExtractField/OPC_CheckField with start bit > 255.
44
// These large start values may arise for architectures with long instruction

Diff for: llvm/utils/TableGen/DecoderEmitter.cpp

+50-65
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@
3232
#include "llvm/Support/CommandLine.h"
3333
#include "llvm/Support/Debug.h"
3434
#include "llvm/Support/ErrorHandling.h"
35-
#include "llvm/Support/FormatVariadic.h"
3635
#include "llvm/Support/FormattedStream.h"
3736
#include "llvm/Support/LEB128.h"
38-
#include "llvm/Support/MathExtras.h"
3937
#include "llvm/Support/raw_ostream.h"
4038
#include "llvm/TableGen/Error.h"
4139
#include "llvm/TableGen/Record.h"
@@ -78,12 +76,6 @@ static cl::opt<SuppressLevel> DecoderEmitterSuppressDuplicates(
7876
"significantly reducing Table Duplications")),
7977
cl::init(SUPPRESSION_DISABLE), cl::cat(DisassemblerEmitterCat));
8078

81-
static cl::opt<uint32_t>
82-
NumToSkipSizeInBytes("num-to-skip-size",
83-
cl::desc("number of bytes to use for num-to-skip "
84-
"entries in the decoder table (2 or 3)"),
85-
cl::init(2), cl::cat(DisassemblerEmitterCat));
86-
8779
STATISTIC(NumEncodings, "Number of encodings considered");
8880
STATISTIC(NumEncodingsLackingDisasm,
8981
"Number of encodings without disassembler info");
@@ -138,29 +130,10 @@ struct DecoderTable : public std::vector<uint8_t> {
138130
// in the table for patching.
139131
size_t insertNumToSkip() {
140132
size_t Size = size();
141-
insert(end(), NumToSkipSizeInBytes, 0);
133+
insert(end(), 3, 0);
142134
return Size;
143135
}
144-
145-
void patchNumToSkip(size_t FixupIdx, uint32_t DestIdx) {
146-
// Calculate the distance from the byte following the fixup entry byte
147-
// to the destination. The Target is calculated from after the
148-
// `NumToSkipSizeInBytes`-byte NumToSkip entry itself, so subtract
149-
// `NumToSkipSizeInBytes` from the displacement here to account for that.
150-
assert(DestIdx >= FixupIdx + NumToSkipSizeInBytes &&
151-
"Expecting a forward jump in the decoding table");
152-
uint32_t Delta = DestIdx - FixupIdx - NumToSkipSizeInBytes;
153-
if (!isUIntN(8 * NumToSkipSizeInBytes, Delta))
154-
PrintFatalError(
155-
"disassembler decoding table too large, try --num-to-skip-size=3");
156-
157-
(*this)[FixupIdx] = static_cast<uint8_t>(Delta);
158-
(*this)[FixupIdx + 1] = static_cast<uint8_t>(Delta >> 8);
159-
if (NumToSkipSizeInBytes == 3)
160-
(*this)[FixupIdx + 2] = static_cast<uint8_t>(Delta >> 16);
161-
}
162136
};
163-
164137
struct DecoderTableInfo {
165138
DecoderTable Table;
166139
FixupScopeList FixupStack;
@@ -717,8 +690,19 @@ static void resolveTableFixups(DecoderTable &Table, const FixupList &Fixups,
717690
uint32_t DestIdx) {
718691
// Any NumToSkip fixups in the current scope can resolve to the
719692
// current location.
720-
for (uint32_t FixupIdx : Fixups)
721-
Table.patchNumToSkip(FixupIdx, DestIdx);
693+
for (uint32_t FixupIdx : reverse(Fixups)) {
694+
// Calculate the distance from the byte following the fixup entry byte
695+
// to the destination. The Target is calculated from after the 24-bit
696+
// NumToSkip entry itself, so subtract three from the displacement here
697+
// to account for that.
698+
uint32_t Delta = DestIdx - FixupIdx - 3;
699+
// Our NumToSkip entries are 24-bits. Make sure our table isn't too
700+
// big.
701+
assert(isUInt<24>(Delta));
702+
Table[FixupIdx] = (uint8_t)Delta;
703+
Table[FixupIdx + 1] = (uint8_t)(Delta >> 8);
704+
Table[FixupIdx + 2] = (uint8_t)(Delta >> 16);
705+
}
722706
}
723707

724708
// Emit table entries to decode instructions given a segment or segments
@@ -775,9 +759,15 @@ void Filter::emitTableEntry(DecoderTableInfo &TableInfo) const {
775759
Delegate->emitTableEntries(TableInfo);
776760

777761
// Now that we've emitted the body of the handler, update the NumToSkip
778-
// of the filter itself to be able to skip forward when false.
779-
if (PrevFilter)
780-
Table.patchNumToSkip(PrevFilter, Table.size());
762+
// of the filter itself to be able to skip forward when false. Subtract
763+
// three as to account for the width of the NumToSkip field itself.
764+
if (PrevFilter) {
765+
uint32_t NumToSkip = Table.size() - PrevFilter - 3;
766+
assert(isUInt<24>(NumToSkip) && "disassembler decoding table too large!");
767+
Table[PrevFilter] = (uint8_t)NumToSkip;
768+
Table[PrevFilter + 1] = (uint8_t)(NumToSkip >> 8);
769+
Table[PrevFilter + 2] = (uint8_t)(NumToSkip >> 16);
770+
}
781771
}
782772

783773
// If there is no fallthrough, then the final filter should get fixed
@@ -824,8 +814,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
824814
OS << (unsigned)*I++ << ", ";
825815
};
826816

827-
// Emit `NumToSkipSizeInBytes`-byte numtoskip value to OS, returning the
828-
// NumToSkip value.
817+
// Emit 24-bit numtoskip value to OS, returning the NumToSkip value.
829818
auto emitNumToSkip = [](DecoderTable::const_iterator &I,
830819
formatted_raw_ostream &OS) {
831820
uint8_t Byte = *I++;
@@ -834,11 +823,9 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
834823
Byte = *I++;
835824
OS << (unsigned)Byte << ", ";
836825
NumToSkip |= Byte << 8;
837-
if (NumToSkipSizeInBytes == 3) {
838-
Byte = *I++;
839-
OS << (unsigned)(Byte) << ", ";
840-
NumToSkip |= Byte << 16;
841-
}
826+
Byte = *I++;
827+
OS << (unsigned)(Byte) << ", ";
828+
NumToSkip |= Byte << 16;
842829
return NumToSkip;
843830
};
844831

@@ -880,7 +867,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
880867
// The filter value is ULEB128 encoded.
881868
emitULEB128(I, OS);
882869

883-
// numtoskip value.
870+
// 24-bit numtoskip value.
884871
uint32_t NumToSkip = emitNumToSkip(I, OS);
885872
OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n";
886873
break;
@@ -896,7 +883,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
896883
// ULEB128 encoded field value.
897884
emitULEB128(I, OS);
898885

899-
// numtoskip value.
886+
// 24-bit numtoskip value.
900887
uint32_t NumToSkip = emitNumToSkip(I, OS);
901888
OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n";
902889
break;
@@ -906,7 +893,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
906893
OS << Indent << "MCD::OPC_CheckPredicate, ";
907894
emitULEB128(I, OS);
908895

909-
// numtoskip value.
896+
// 24-bit numtoskip value.
910897
uint32_t NumToSkip = emitNumToSkip(I, OS);
911898
OS << "// Skip to: " << ((I - Table.begin()) + NumToSkip) << "\n";
912899
break;
@@ -938,7 +925,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
938925

939926
// Fallthrough for OPC_TryDecode.
940927

941-
// numtoskip value.
928+
// 24-bit numtoskip value.
942929
uint32_t NumToSkip = emitNumToSkip(I, OS);
943930

944931
OS << "// Opcode: " << NumberedEncodings[EncodingID]
@@ -1424,9 +1411,9 @@ void FilterChooser::emitSingletonTableEntry(DecoderTableInfo &TableInfo,
14241411
TableInfo.Table.push_back(NumBits);
14251412
TableInfo.Table.insertULEB128(Ilnd.FieldVal);
14261413

1427-
// Allocate space in the table for fixup (NumToSkipSizeInBytes) so all
1428-
// our relative position calculations work OK even before we fully
1429-
// resolve the real value here.
1414+
// The fixup is always 24-bits, so go ahead and allocate the space
1415+
// in the table so all our relative position calculations work OK even
1416+
// before we fully resolve the real value here.
14301417

14311418
// Push location for NumToSkip backpatching.
14321419
TableInfo.FixupStack.back().push_back(TableInfo.Table.insertNumToSkip());
@@ -2170,18 +2157,7 @@ insertBits(InsnType &field, uint64_t bits, unsigned startBit, unsigned numBits)
21702157
// decodeInstruction().
21712158
static void emitDecodeInstruction(formatted_raw_ostream &OS,
21722159
bool IsVarLenInst) {
2173-
OS << formatv("\nconstexpr unsigned NumToSkipSizeInBytes = {};\n",
2174-
NumToSkipSizeInBytes);
2175-
21762160
OS << R"(
2177-
inline unsigned decodeNumToSkip(const uint8_t *&Ptr) {
2178-
unsigned NumToSkip = *Ptr++;
2179-
NumToSkip |= (*Ptr++) << 8;
2180-
if constexpr (NumToSkipSizeInBytes == 3)
2181-
NumToSkip |= (*Ptr++) << 16;
2182-
return NumToSkip;
2183-
}
2184-
21852161
template <typename InsnType>
21862162
static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
21872163
InsnType insn, uint64_t Address,
@@ -2219,7 +2195,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22192195
// Decode the field value.
22202196
uint64_t Val = decodeULEB128AndIncUnsafe(++Ptr);
22212197
bool Failed = Val != CurFieldValue;
2222-
unsigned NumToSkip = decodeNumToSkip(Ptr);
2198+
// NumToSkip is a plain 24-bit integer.
2199+
unsigned NumToSkip = *Ptr++;
2200+
NumToSkip |= (*Ptr++) << 8;
2201+
NumToSkip |= (*Ptr++) << 16;
22232202
22242203
// Perform the filter operation.
22252204
if (Failed)
@@ -2243,7 +2222,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22432222
uint64_t ExpectedValue = decodeULEB128(++Ptr, &PtrLen);
22442223
Ptr += PtrLen;
22452224
bool Failed = ExpectedValue != FieldValue;
2246-
unsigned NumToSkip = decodeNumToSkip(Ptr);
2225+
// NumToSkip is a plain 24-bit integer.
2226+
unsigned NumToSkip = *Ptr++;
2227+
NumToSkip |= (*Ptr++) << 8;
2228+
NumToSkip |= (*Ptr++) << 16;
22472229
22482230
// If the actual and expected values don't match, skip.
22492231
if (Failed)
@@ -2258,7 +2240,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22582240
case MCD::OPC_CheckPredicate: {
22592241
// Decode the Predicate Index value.
22602242
unsigned PIdx = decodeULEB128AndIncUnsafe(++Ptr);
2261-
unsigned NumToSkip = decodeNumToSkip(Ptr);
2243+
// NumToSkip is a plain 24-bit integer.
2244+
unsigned NumToSkip = *Ptr++;
2245+
NumToSkip |= (*Ptr++) << 8;
2246+
NumToSkip |= (*Ptr++) << 16;
22622247
// Check the predicate.
22632248
bool Failed = !checkDecoderPredicate(PIdx, Bits);
22642249
if (Failed)
@@ -2293,7 +2278,10 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
22932278
// Decode the Opcode value.
22942279
unsigned Opc = decodeULEB128AndIncUnsafe(++Ptr);
22952280
unsigned DecodeIdx = decodeULEB128AndIncUnsafe(Ptr);
2296-
unsigned NumToSkip = decodeNumToSkip(Ptr);
2281+
// NumToSkip is a plain 24-bit integer.
2282+
unsigned NumToSkip = *Ptr++;
2283+
NumToSkip |= (*Ptr++) << 8;
2284+
NumToSkip |= (*Ptr++) << 16;
22972285
22982286
// Perform the decode operation.
22992287
MCInst TmpMI;
@@ -2418,9 +2406,6 @@ handleHwModesUnrelatedEncodings(const CodeGenInstruction *Instr,
24182406

24192407
// Emits disassembler code for instruction decoding.
24202408
void DecoderEmitter::run(raw_ostream &o) {
2421-
if (NumToSkipSizeInBytes != 2 && NumToSkipSizeInBytes != 3)
2422-
PrintFatalError("Invalid value for num-to-skip-size, must be 2 or 3");
2423-
24242409
formatted_raw_ostream OS(o);
24252410
OS << R"(
24262411
#include "llvm/MC/MCInst.h"

0 commit comments

Comments
 (0)