diff --git a/llvm/test/TableGen/get-operand-type-no-expand.td b/llvm/test/TableGen/get-operand-type-no-expand.td new file mode 100644 --- /dev/null +++ b/llvm/test/TableGen/get-operand-type-no-expand.td @@ -0,0 +1,48 @@ +// Test -instr-info-expand-mi-operand-info=0 mode which keeps complex operands +// that contain a DAG of basic operands unexpanded (the default is to expand). + +include "llvm/Target/Target.td" + +def archInstrInfo : InstrInfo { } + +def arch : Target { + let InstructionSet = archInstrInfo; +} + +def Reg : Register<"reg">; +def RegClass : RegisterClass<"foo", [i32], 0, (add Reg)>; + +class ComplexOperand : Operand { + let MIOperandInfo = (ops i8imm, i32imm); + int Size = size; +} + +def i8complex : ComplexOperand<8>; +def i512complex: ComplexOperand<512>; + +def InstA : Instruction { + let Size = 1; + let OutOperandList = (outs i512complex:$a); + let InOperandList = (ins i8complex:$b, i32imm:$c); + field bits<8> Inst; + field bits<8> SoftFail = 0; + let Namespace = "MyNamespace"; +} + +// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s \ +// RUN: -instr-info-expand-mi-operand-info=1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-EXPAND +// CHECK-EXPAND: #ifdef GET_INSTRINFO_OPERAND_TYPE +// CHECK-EXPAND: OpcodeOperandTypes[] = { +// CHECK-EXPAND: /* InstA */ +// CHECK-EXPAND-NEXT: i8imm, i32imm, i8imm, i32imm, i32imm, +// CHECK-EXPAND: #endif // GET_INSTRINFO_OPERAND_TYPE + +// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s \ +// RUN: -instr-info-expand-mi-operand-info=0 \ +// RUN: | FileCheck %s --check-prefix=CHECK-NOEXPAND +// CHECK-NOEXPAND: #ifdef GET_INSTRINFO_OPERAND_TYPE +// CHECK-NOEXPAND: OpcodeOperandTypes[] = { +// CHECK-NOEXPAND: /* InstA */ +// CHECK-NOEXPAND-NEXT: i512complex, i8complex, i32imm, +// CHECK-NOEXPAND: #endif // GET_INSTRINFO_OPERAND_TYPE diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp --- a/llvm/utils/TableGen/InstrInfoEmitter.cpp +++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp @@ -36,6 +36,12 @@ using namespace llvm; +cl::OptionCategory InstrInfoEmitterCat("Options for -gen-instr-info"); +static cl::opt ExpandMIOperandInfo( + "instr-info-expand-mi-operand-info", + cl::desc("Expand operand's MIOperandInfo DAG into suboperands"), + cl::cat(InstrInfoEmitterCat), cl::init(true)); + namespace { class InstrInfoEmitter { @@ -391,7 +397,7 @@ OperandOffsets.push_back(CurrentOffset); for (const auto &Op : Inst->Operands) { const DagInit *MIOI = Op.MIOperandInfo; - if (!MIOI || MIOI->getNumArgs() == 0) { + if (!ExpandMIOperandInfo || !MIOI || MIOI->getNumArgs() == 0) { // Single, anonymous, operand. OperandRecords.push_back(Op.Rec); ++CurrentOffset;