[llvm] [LLVM][TableGen] Adjust pointer increments in DecoderEmitter (PR #136230)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 17 17:24:37 PDT 2025
https://github.com/jurahul created https://github.com/llvm/llvm-project/pull/136230
- In both `emitTable` and the generated `decodeInstruction` function increment the pointer to the decoder op as a part of the switch statement instead of later on in each case.
>From 5e1a8eb8d48ca19acb7361c2689e4433e746939b Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Thu, 17 Apr 2025 17:12:38 -0700
Subject: [PATCH] [LLVM][TableGen] Adjust pointer increments in DecoderEmitter
- In both `emitTable` and the generated `decodeInstruction` function,
increment the pointer to the decoder op as a part of the switch
statement instead of later on in each case.
---
llvm/utils/TableGen/DecoderEmitter.cpp | 30 +++++++++++---------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index 9c6015cc24576..06efeab5d1293 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -840,11 +840,11 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
OS << "/* " << Pos << " */";
OS.PadToColumn(12);
- switch (*I) {
+ const uint8_t DecoderOp = *I++;
+ switch (DecoderOp) {
default:
- PrintFatalError("invalid decode table opcode");
+ PrintFatalError("Invalid decode table opcode: " + Twine(DecoderOp));
case MCD::OPC_ExtractField: {
- ++I;
OS << Indent << "MCD::OPC_ExtractField, ";
// ULEB128 encoded start value.
@@ -862,7 +862,6 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
break;
}
case MCD::OPC_FilterValue: {
- ++I;
OS << Indent << "MCD::OPC_FilterValue, ";
// The filter value is ULEB128 encoded.
emitULEB128(I, OS);
@@ -873,7 +872,6 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
break;
}
case MCD::OPC_CheckField: {
- ++I;
OS << Indent << "MCD::OPC_CheckField, ";
// ULEB128 encoded start value.
emitULEB128(I, OS);
@@ -889,7 +887,6 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
break;
}
case MCD::OPC_CheckPredicate: {
- ++I;
OS << Indent << "MCD::OPC_CheckPredicate, ";
emitULEB128(I, OS);
@@ -900,8 +897,7 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
}
case MCD::OPC_Decode:
case MCD::OPC_TryDecode: {
- bool IsTry = *I == MCD::OPC_TryDecode;
- ++I;
+ bool IsTry = DecoderOp == MCD::OPC_TryDecode;
// Decode the Opcode value.
const char *ErrMsg = nullptr;
unsigned Opc = decodeULEB128(Table.data() + Pos + 1, nullptr,
@@ -933,7 +929,6 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
break;
}
case MCD::OPC_SoftFail: {
- ++I;
OS << Indent << "MCD::OPC_SoftFail";
// Positive mask
uint64_t Value = 0;
@@ -965,7 +960,6 @@ void DecoderEmitter::emitTable(formatted_raw_ostream &OS, DecoderTable &Table,
break;
}
case MCD::OPC_Fail: {
- ++I;
OS << Indent << "MCD::OPC_Fail,\n";
break;
}
@@ -2175,13 +2169,13 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
DecodeStatus S = MCDisassembler::Success;
while (true) {
ptrdiff_t Loc = Ptr - DecodeTable;
- switch (*Ptr) {
+ switch (*Ptr++) {
default:
errs() << Loc << ": Unexpected decode table opcode!\n";
return MCDisassembler::Fail;
case MCD::OPC_ExtractField: {
// Decode the start value.
- unsigned Start = decodeULEB128AndIncUnsafe(++Ptr);
+ unsigned Start = decodeULEB128AndIncUnsafe(Ptr);
unsigned Len = *Ptr++;)";
if (IsVarLenInst)
OS << "\n makeUp(insn, Start + Len);";
@@ -2193,7 +2187,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_FilterValue: {
// Decode the field value.
- uint64_t Val = decodeULEB128AndIncUnsafe(++Ptr);
+ uint64_t Val = decodeULEB128AndIncUnsafe(Ptr);
bool Failed = Val != CurFieldValue;
// NumToSkip is a plain 24-bit integer.
unsigned NumToSkip = *Ptr++;
@@ -2211,7 +2205,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_CheckField: {
// Decode the start value.
- unsigned Start = decodeULEB128AndIncUnsafe(++Ptr);
+ unsigned Start = decodeULEB128AndIncUnsafe(Ptr);
unsigned Len = *Ptr;)";
if (IsVarLenInst)
OS << "\n makeUp(insn, Start + Len);";
@@ -2239,7 +2233,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_CheckPredicate: {
// Decode the Predicate Index value.
- unsigned PIdx = decodeULEB128AndIncUnsafe(++Ptr);
+ unsigned PIdx = decodeULEB128AndIncUnsafe(Ptr);
// NumToSkip is a plain 24-bit integer.
unsigned NumToSkip = *Ptr++;
NumToSkip |= (*Ptr++) << 8;
@@ -2255,7 +2249,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_Decode: {
// Decode the Opcode value.
- unsigned Opc = decodeULEB128AndIncUnsafe(++Ptr);
+ unsigned Opc = decodeULEB128AndIncUnsafe(Ptr);
unsigned DecodeIdx = decodeULEB128AndIncUnsafe(Ptr);
MI.clear();
@@ -2276,7 +2270,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_TryDecode: {
// Decode the Opcode value.
- unsigned Opc = decodeULEB128AndIncUnsafe(++Ptr);
+ unsigned Opc = decodeULEB128AndIncUnsafe(Ptr);
unsigned DecodeIdx = decodeULEB128AndIncUnsafe(Ptr);
// NumToSkip is a plain 24-bit integer.
unsigned NumToSkip = *Ptr++;
@@ -2309,7 +2303,7 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
}
case MCD::OPC_SoftFail: {
// Decode the mask values.
- uint64_t PositiveMask = decodeULEB128AndIncUnsafe(++Ptr);
+ uint64_t PositiveMask = decodeULEB128AndIncUnsafe(Ptr);
uint64_t NegativeMask = decodeULEB128AndIncUnsafe(Ptr);
bool Fail = (insn & PositiveMask) != 0 || (~insn & NegativeMask) != 0;
if (Fail)
More information about the llvm-commits
mailing list