[llvm] [TableGen][DecoderEmitter] Inline a couple of trivial functions (NFC) (PR #159099)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 16 07:22:29 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-tablegen
Author: Sergei Barannikov (s-barannikov)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/159099.diff
1 Files Affected:
- (modified) llvm/utils/TableGen/DecoderEmitter.cpp (+34-52)
``````````diff
diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp
index 43e1299563762..159f9a781356f 100644
--- a/llvm/utils/TableGen/DecoderEmitter.cpp
+++ b/llvm/utils/TableGen/DecoderEmitter.cpp
@@ -1063,8 +1063,11 @@ static void emitBinaryParser(raw_ostream &OS, indent Indent,
}
}
-static void emitDecoder(raw_ostream &OS, indent Indent,
- const InstructionEncoding &Encoding) {
+static std::string getDecoderString(const InstructionEncoding &Encoding) {
+ std::string Decoder;
+ raw_string_ostream OS(Decoder);
+ indent Indent(UseFnTableInDecodeToMCInst ? 2 : 4);
+
// If a custom instruction decoder was specified, use that.
StringRef DecoderMethod = Encoding.getDecoderMethod();
if (!DecoderMethod.empty()) {
@@ -1072,73 +1075,45 @@ static void emitDecoder(raw_ostream &OS, indent Indent,
<< "(MI, insn, Address, Decoder))) { "
<< (Encoding.hasCompleteDecoder() ? "" : "DecodeComplete = false; ")
<< "return MCDisassembler::Fail; }\n";
- return;
+ } else {
+ for (const OperandInfo &Op : Encoding.getOperands())
+ emitBinaryParser(OS, Indent, Encoding, Op);
}
-
- for (const OperandInfo &Op : Encoding.getOperands())
- emitBinaryParser(OS, Indent, Encoding, Op);
+ return Decoder;
}
-static unsigned getDecoderIndex(const InstructionEncoding &Encoding,
- DecoderTableInfo &TableInfo) {
- // Build up the predicate string.
- SmallString<256> Decoder;
- // FIXME: emitDecoder() function can take a buffer directly rather than
- // a stream.
- raw_svector_ostream S(Decoder);
- indent Indent(UseFnTableInDecodeToMCInst ? 2 : 4);
- emitDecoder(S, Indent, Encoding);
-
- // Using the full decoder string as the key value here is a bit
- // heavyweight, but is effective. If the string comparisons become a
- // performance concern, we can implement a mangling of the predicate
- // data easily enough with a map back to the actual string. That's
- // overkill for now, though.
- TableInfo.insertDecoder(Decoder);
- return TableInfo.getDecoderIndex(Decoder);
-}
-
-// Returns true if there was any predicate emitted.
-static bool emitPredicateMatch(raw_ostream &OS,
- const InstructionEncoding &Encoding,
- StringRef TargetName) {
+static std::string getPredicateString(const InstructionEncoding &Encoding,
+ StringRef TargetName) {
std::vector<const Record *> Predicates =
Encoding.getRecord()->getValueAsListOfDefs("Predicates");
auto It = llvm::find_if(Predicates, [](const Record *R) {
return R->getValueAsBit("AssemblerMatcherPredicate");
});
- bool AnyAsmPredicate = It != Predicates.end();
- if (!AnyAsmPredicate)
- return false;
+ if (It == Predicates.end())
+ return std::string();
+
+ std::string Predicate;
+ raw_string_ostream OS(Predicate);
SubtargetFeatureInfo::emitMCPredicateCheck(OS, TargetName, Predicates);
- return true;
+ return Predicate;
}
-static unsigned getPredicateIndex(StringRef Predicate,
- DecoderTableInfo &TableInfo) {
+void DecoderTableBuilder::emitPredicateTableEntry(unsigned EncodingID) const {
+ const InstructionEncoding &Encoding = Encodings[EncodingID];
+ std::string Predicate = getPredicateString(Encoding, Target.getName());
+ if (Predicate.empty())
+ return;
+
// Using the full predicate string as the key value here is a bit
// heavyweight, but is effective. If the string comparisons become a
// performance concern, we can implement a mangling of the predicate
// data easily enough with a map back to the actual string. That's
// overkill for now, though.
TableInfo.insertPredicate(Predicate);
- return TableInfo.getPredicateIndex(Predicate);
-}
-
-void DecoderTableBuilder::emitPredicateTableEntry(unsigned EncodingID) const {
- const InstructionEncoding &Encoding = Encodings[EncodingID];
- // Build up the predicate string.
- SmallString<256> Predicate;
- raw_svector_ostream PS(Predicate);
- if (!emitPredicateMatch(PS, Encoding, Target.getName()))
- return;
-
- // Figure out the index into the predicate table for the predicate just
- // computed.
- unsigned PIdx = getPredicateIndex(PS.str(), TableInfo);
+ unsigned PredicateIndex = TableInfo.getPredicateIndex(Predicate);
TableInfo.Table.insertOpcode(OPC_CheckPredicate);
- TableInfo.Table.insertULEB128(PIdx);
+ TableInfo.Table.insertULEB128(PredicateIndex);
}
void DecoderTableBuilder::emitSoftFailTableEntry(unsigned EncodingID) const {
@@ -1181,7 +1156,14 @@ void DecoderTableBuilder::emitSingletonTableEntry(
// Check for soft failure of the match.
emitSoftFailTableEntry(EncodingID);
- unsigned DIdx = getDecoderIndex(Encoding, TableInfo);
+ // Using the full decoder string as the key value here is a bit
+ // heavyweight, but is effective. If the string comparisons become a
+ // performance concern, we can implement a mangling of the predicate
+ // data easily enough with a map back to the actual string. That's
+ // overkill for now, though.
+ std::string Decoder = getDecoderString(Encoding);
+ TableInfo.insertDecoder(Decoder);
+ unsigned DecoderIndex = TableInfo.getDecoderIndex(Decoder);
// Produce OPC_Decode or OPC_TryDecode opcode based on the information
// whether the instruction decoder is complete or not. If it is complete
@@ -1197,7 +1179,7 @@ void DecoderTableBuilder::emitSingletonTableEntry(
TableInfo.Table.insertOpcode(DecoderOp);
const Record *InstDef = Encodings[EncodingID].getInstruction()->TheDef;
TableInfo.Table.insertULEB128(Target.getInstrIntValue(InstDef));
- TableInfo.Table.insertULEB128(DIdx);
+ TableInfo.Table.insertULEB128(DecoderIndex);
}
std::unique_ptr<Filter>
``````````
</details>
https://github.com/llvm/llvm-project/pull/159099
More information about the llvm-commits
mailing list