[llvm] [TableGen] Split large printInstruction() for NVPTX to avoid compiler limits (PR #218530)
Kazu Hirata via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 13:57:53 PDT 2026
================
@@ -579,29 +598,132 @@ void AsmWriterEmitter::EmitPrintInstruction(
llvm::erase_if(Instructions,
[](AsmWriterInst &Inst) { return Inst.Operands.empty(); });
- // Because this is a vector, we want to emit from the end. Reverse all of the
- // elements in the vector.
- std::reverse(Instructions.begin(), Instructions.end());
-
- std::vector<InstructionGroup> Groups = groupInstructions(Instructions);
-
// Now that we've emitted all of the operand info that fit into 64 bits, emit
// information for those instructions that are left. This is a less dense
// encoding, but we expect the main 64-bit table to handle the majority of
// instructions.
- if (!Groups.empty()) {
- // Find the opcode # of inline asm.
- O << " switch (MI->getOpcode()) {\n";
- O << " default: llvm_unreachable(\"Unexpected opcode.\");\n";
- for (const InstructionGroup &G : Groups)
- emitInstructions(G, O, PassSubtarget);
+ if (!Instructions.empty()) {
+ if (UseFnPtrTable) {
+ // Single unconditional indirect call; the function-pointer table was
+ // emitted above, before printInstruction().
+ EmitOpcodePatternDispatch(O, Target.getName(), ClassName, PassSubtarget);
+ } else {
+ // Because this is a vector, we want to emit from the end. Reverse all
+ // of the elements in the vector.
+ std::reverse(Instructions.begin(), Instructions.end());
- O << " }\n";
+ std::vector<InstructionGroup> Groups = groupInstructions(Instructions);
+
+ O << " switch (MI->getOpcode()) {\n";
+ O << " default: llvm_unreachable(\"Unexpected opcode.\");\n";
+ for (const InstructionGroup &G : Groups)
+ emitInstructions(G, O, PassSubtarget);
+
+ O << " }\n";
+ }
}
O << "}\n";
}
+void AsmWriterEmitter::EmitOpcodePatternTable(raw_ostream &O,
+ StringRef TargetName,
+ StringRef ClassName,
+ bool PassSubtarget) {
+ // Collect overflow instructions that still have operands to print.
+ std::vector<AsmWriterInst> OpcodeInsts;
+ for (const AsmWriterInst &AWI : Instructions) {
+ if (!AWI.Operands.empty())
+ OpcodeInsts.push_back(AWI);
+ }
----------------
kazutakahirata wrote:
May I suggest removing this filter loop and directly using `Instructions` in the code below? You should be able to do so if we move up `llvm::erase_if`. (See the comment above.)
https://github.com/llvm/llvm-project/pull/218530
More information about the llvm-commits
mailing list