diff --git a/llvm/test/TableGen/pseudo-inst-expansion.td b/llvm/test/TableGen/pseudo-inst-expansion.td --- a/llvm/test/TableGen/pseudo-inst-expansion.td +++ b/llvm/test/TableGen/pseudo-inst-expansion.td @@ -35,3 +35,23 @@ PseudoInstExpansion<(INSTR GPR:$rd, SR.Encoding)>; // CHECK: .addOperand(MCOperand::createImm(3855)); + +def ComplexOp : Operand { let MIOperandInfo = (ops GPR, i32imm); } + +def INSTR2 : Instruction { + let OutOperandList = (outs); + let InOperandList = (ins ComplexOp:$cop, GPR:$r); +} + +def PSEUDO2 : Pseudo<(outs), (ins ComplexOp:$cop), []>, + PseudoInstExpansion<(INSTR2 ComplexOp:$cop, REG)>; + +// CHECK: TmpInst.setOpcode(::INSTR2); +// CHECK-NEXT: // Operand: cop +// CHECK-NEXT: lowerOperand(MI->getOperand(0), MCOp); +// CHECK-NEXT: TmpInst.addOperand(MCOp); +// CHECK-NEXT: lowerOperand(MI->getOperand(1), MCOp); +// CHECK-NEXT: TmpInst.addOperand(MCOp); +// CHECK-NEXT: // Operand: r +// CHECK-NEXT: TmpInst.addOperand(MCOperand::createReg(::REG)); +// CHECK-NEXT: EmitToStreamer(OutStreamer, TmpInst); diff --git a/llvm/utils/TableGen/PseudoLoweringEmitter.cpp b/llvm/utils/TableGen/PseudoLoweringEmitter.cpp --- a/llvm/utils/TableGen/PseudoLoweringEmitter.cpp +++ b/llvm/utils/TableGen/PseudoLoweringEmitter.cpp @@ -104,6 +104,8 @@ for (unsigned I = 0, E = Insn.Operands[i].MINumOperands; I != E; ++I) OperandMap[BaseIdx + i + I].Kind = OpData::Operand; OpsAdded += Insn.Operands[i].MINumOperands; + // Since we added more than one, we also need to adjust the base. + BaseIdx += Insn.Operands[i].MINumOperands - 1; } else if (IntInit *II = dyn_cast(Dag->getArg(i))) { OperandMap[BaseIdx + i].Kind = OpData::Imm; OperandMap[BaseIdx + i].Data.Imm = II->getValue();