[llvm] r372641 - [TableGen] Emit OperandType enums for RegisterOperands/RegisterClasses
Aditya Nandakumar via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 23 11:51:01 PDT 2019
Author: aditya_nandakumar
Date: Mon Sep 23 11:51:00 2019
New Revision: 372641
URL: http://llvm.org/viewvc/llvm-project?rev=372641&view=rev
Log:
[TableGen] Emit OperandType enums for RegisterOperands/RegisterClasses
https://reviews.llvm.org/D66773
The OpTypes::OperandType was creating an enum for all records that
inherit from Operand, but in reality there are operands for instructions
that inherit from other types too. In particular, RegisterOperand and
RegisterClass. This commit adds those types to the list of operand types
that are tracked by the OperandType enum.
Patch by: nlguillemot
Modified:
llvm/trunk/test/TableGen/get-operand-type.td
llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
Modified: llvm/trunk/test/TableGen/get-operand-type.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/get-operand-type.td?rev=372641&r1=372640&r2=372641&view=diff
==============================================================================
--- llvm/trunk/test/TableGen/get-operand-type.td (original)
+++ llvm/trunk/test/TableGen/get-operand-type.td Mon Sep 23 11:51:00 2019
@@ -16,6 +16,8 @@ def RegClass : RegisterClass<"foo", [i32
def OpA : Operand<i32>;
def OpB : Operand<i32>;
+def RegOp : RegisterOperand<RegClass>;
+
def InstA : Instruction {
let Size = 1;
let OutOperandList = (outs OpA:$a);
@@ -34,7 +36,17 @@ def InstB : Instruction {
let Namespace = "MyNamespace";
}
+def InstC : Instruction {
+ let Size = 1;
+ let OutOperandList = (outs RegClass:$d);
+ let InOperandList = (ins RegOp:$x);
+ field bits<8> Inst;
+ field bits<8> SoftFail = 0;
+ let Namespace = "MyNamespace";
+}
+
// CHECK: #ifdef GET_INSTRINFO_OPERAND_TYPE
// CHECK: OpTypes::OpA, OpTypes::OpB, OpTypes::i32imm,
// CHECK-NEXT: OpTypes::i32imm, -1,
-// CHECK: #endif //GET_INSTRINFO_OPERAND_TYPE
+// CHECK-NEXT: OpTypes::RegClass, OpTypes::RegOp,
+// CHECK: #endif // GET_INSTRINFO_OPERAND_TYPE
Modified: llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp?rev=372641&r1=372640&r2=372641&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Mon Sep 23 11:51:00 2019
@@ -332,6 +332,10 @@ void InstrInfoEmitter::emitOperandTypeMa
StringRef Namespace = Target.getInstNamespace();
std::vector<Record *> Operands = Records.getAllDerivedDefinitions("Operand");
+ std::vector<Record *> RegisterOperands =
+ Records.getAllDerivedDefinitions("RegisterOperand");
+ std::vector<Record *> RegisterClasses =
+ Records.getAllDerivedDefinitions("RegisterClass");
OS << "#ifdef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
OS << "#undef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
@@ -341,10 +345,13 @@ void InstrInfoEmitter::emitOperandTypeMa
OS << "enum OperandType {\n";
unsigned EnumVal = 0;
- for (const Record *Op : Operands) {
- if (!Op->isAnonymous())
- OS << " " << Op->getName() << " = " << EnumVal << ",\n";
- ++EnumVal;
+ for (const std::vector<Record *> *RecordsToAdd :
+ {&Operands, &RegisterOperands, &RegisterClasses}) {
+ for (const Record *Op : *RecordsToAdd) {
+ if (!Op->isAnonymous())
+ OS << " " << Op->getName() << " = " << EnumVal << ",\n";
+ ++EnumVal;
+ }
}
OS << " OPERAND_TYPE_LIST_END" << "\n};\n";
@@ -358,7 +365,8 @@ void InstrInfoEmitter::emitOperandTypeMa
OS << "namespace llvm {\n";
OS << "namespace " << Namespace << " {\n";
OS << "LLVM_READONLY\n";
- OS << "int getOperandType(uint16_t Opcode, uint16_t OpIdx) {\n";
+ OS << "static int getOperandType(uint16_t Opcode, uint16_t OpIdx) {\n";
+ // TODO: Factor out instructions with same operands to compress the tables.
if (!NumberedInstructions.empty()) {
std::vector<int> OperandOffsets;
std::vector<Record *> OperandRecords;
@@ -399,7 +407,10 @@ void InstrInfoEmitter::emitOperandTypeMa
OS << "/**/\n ";
}
Record *OpR = OperandRecords[I];
- if (OpR->isSubClassOf("Operand") && !OpR->isAnonymous())
+ if ((OpR->isSubClassOf("Operand") ||
+ OpR->isSubClassOf("RegisterOperand") ||
+ OpR->isSubClassOf("RegisterClass")) &&
+ !OpR->isAnonymous())
OS << "OpTypes::" << OpR->getName();
else
OS << -1;
@@ -414,7 +425,7 @@ void InstrInfoEmitter::emitOperandTypeMa
OS << "}\n";
OS << "} // end namespace " << Namespace << "\n";
OS << "} // end namespace llvm\n";
- OS << "#endif //GET_INSTRINFO_OPERAND_TYPE\n\n";
+ OS << "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n";
}
void InstrInfoEmitter::emitMCIIHelperMethods(raw_ostream &OS,
More information about the llvm-commits
mailing list