[llvm] [DecoderEmitter] Eliminate `DecodeComplete` parameter to `decodeToMCInst` (PR #159130)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 16 09:54:06 PDT 2025
https://github.com/jurahul created https://github.com/llvm/llvm-project/pull/159130
Currently, the code generated by decoder emitter always set `DeocdeComplete` to false when returning Fail from `decodeToMCInst`. As a result, we can just use the return `DecodeStatus` from `decodeToMCInst` to decide whether to terminate the decoding and return or continue trying.
>From c91b80dc8ec593362a612213b71847138494628f Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Tue, 16 Sep 2025 09:50:08 -0700
Subject: [PATCH] [DecoderEmitter] Eliminate `DecodeComplete` parameter to
`decodeToMCInst`
Currently, the code generated by decoder emitter always set
`DeocdeComplete` to false when returning Fail from `decodeToMCInst`. As
a result, we can just use the return `DecodeStatus` from
`decodeToMCInst` to decide whether to terminate the decoding and
return or continue trying.
---
.../llvm/MC/MCDisassembler/MCDisassembler.h | 10 +++----
llvm/utils/TableGen/DecoderEmitter.cpp | 26 ++++++-------------
2 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h b/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h
index cae2fbcac1fef..3d10380fa1d46 100644
--- a/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h
+++ b/llvm/include/llvm/MC/MCDisassembler/MCDisassembler.h
@@ -98,11 +98,11 @@ class LLVM_ABI MCDisassembler {
/// from Success->SoftFail ->Fail can be done with a simple
/// bitwise-AND:
///
- /// LEFT & TOP = | Success Unpredictable Fail
- /// --------------+-----------------------------------
- /// Success | Success Unpredictable Fail
- /// Unpredictable | Unpredictable Unpredictable Fail
- /// Fail | Fail Fail Fail
+ /// LEFT & TOP = | Success SoftFail Fail
+ /// --------------+-----------------------------
+ /// Success | Success SoftFail Fail
+ /// SoftFail | SoftFail SoftFail Fail
+ /// Fail | Fail Fail Fail
///
/// An easy way of encoding this is as 0b11, 0b01, 0b00 for
/// Success, SoftFail, Fail respectively.
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index 43e1299563762..c6e6629108c9f 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -868,7 +868,7 @@ void DecoderEmitter::emitDecoderFunction(formatted_raw_ostream &OS,
"InsnType, uint64_t>;\n";
StringRef DecodeParams =
"DecodeStatus S, InsnType insn, MCInst &MI, uint64_t Address, const "
- "MCDisassembler *Decoder, bool &DecodeComplete";
+ "MCDisassembler *Decoder";
// Print the name of the decode function to OS.
auto PrintDecodeFnName = [&OS, BucketBitWidth](unsigned DecodeIdx) {
@@ -907,7 +907,6 @@ void DecoderEmitter::emitDecoderFunction(formatted_raw_ostream &OS,
OS << "// Handling " << Decoders.size() << " cases.\n";
PrintTemplate();
OS << "decodeToMCInst(unsigned Idx, " << DecodeParams << ") {\n";
- OS << " DecodeComplete = true;\n";
if (UseFnTableInDecodeToMCInst) {
// Build a table of function pointers
@@ -921,8 +920,7 @@ void DecoderEmitter::emitDecoderFunction(formatted_raw_ostream &OS,
OS << " };\n";
OS << " if (Idx >= " << Decoders.size() << ")\n";
OS << " llvm_unreachable(\"Invalid decoder index!\");\n";
- OS << " return decodeFnTable[Idx](S, insn, MI, Address, Decoder, "
- "DecodeComplete);\n";
+ OS << " return decodeFnTable[Idx](S, insn, MI, Address, Decoder);\n";
} else {
OS << " " << TmpTypeDecl;
OS << " TmpType tmp;\n";
@@ -1055,9 +1053,7 @@ static void emitBinaryParser(raw_ostream &OS, indent Indent,
StringRef Decoder = OpInfo.Decoder;
if (!Decoder.empty()) {
OS << Indent << "if (!Check(S, " << Decoder
- << "(MI, tmp, Address, Decoder))) { "
- << (OpInfo.HasCompleteDecoder ? "" : "DecodeComplete = false; ")
- << "return MCDisassembler::Fail; }\n";
+ << "(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; }\n";
} else {
OS << Indent << "MI.addOperand(MCOperand::createImm(tmp));\n";
}
@@ -1069,9 +1065,7 @@ static void emitDecoder(raw_ostream &OS, indent Indent,
StringRef DecoderMethod = Encoding.getDecoderMethod();
if (!DecoderMethod.empty()) {
OS << Indent << "if (!Check(S, " << DecoderMethod
- << "(MI, insn, Address, Decoder))) { "
- << (Encoding.hasCompleteDecoder() ? "" : "DecodeComplete = false; ")
- << "return MCDisassembler::Fail; }\n";
+ << "(MI, insn, Address, Decoder))) { return MCDisassembler::Fail; }\n";
return;
}
@@ -1704,15 +1698,13 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
unsigned DecodeIdx = decodeULEB128AndIncUnsafe(Ptr);
MI.clear();
- MI.setOpcode(Opc);
- bool DecodeComplete;)";
+ MI.setOpcode(Opc);)";
if (IsVarLenInst) {
OS << "\n unsigned Len = InstrLenTable[Opc];\n"
<< " makeUp(insn, Len);";
}
OS << R"(
- S = decodeToMCInst(DecodeIdx, S, insn, MI, Address, DisAsm, DecodeComplete);
- assert(DecodeComplete);
+ S = decodeToMCInst(DecodeIdx, S, insn, MI, Address, DisAsm);
LLVM_DEBUG(dbgs() << Loc << ": OPC_Decode: opcode " << Opc
<< ", using decoder " << DecodeIdx << ": "
@@ -1729,18 +1721,16 @@ static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI,
// Perform the decode operation.
MCInst TmpMI;
TmpMI.setOpcode(Opc);
- bool DecodeComplete;
- S = decodeToMCInst(DecodeIdx, S, insn, TmpMI, Address, DisAsm, DecodeComplete);
+ S = decodeToMCInst(DecodeIdx, S, insn, TmpMI, Address, DisAsm);
LLVM_DEBUG(dbgs() << Loc << ": OPC_TryDecode: opcode " << Opc
<< ", using decoder " << DecodeIdx << ": ");
- if (DecodeComplete) {
+ if (S != MCDisassembler::Fail) {
// Decoding complete.
LLVM_DEBUG(dbgs() << (S != MCDisassembler::Fail ? "PASS\n" : "FAIL\n"));
MI = TmpMI;
return S;
}
- assert(S == MCDisassembler::Fail);
if (ScopeStack.empty()) {
LLVM_DEBUG(dbgs() << "FAIL, returning FAIL\n");
return MCDisassembler::Fail;
More information about the llvm-commits
mailing list