[llvm] [TableGen] Store flat source operand number in OperandMap in PseudoLoweringEmitter. NFC (PR #135886)

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 16 09:48:15 PDT 2025


================
@@ -181,24 +181,32 @@ void PseudoLoweringEmitter::evaluateExpansion(const Record *Rec) {
     SourceOperands[SrcOp.Name] = Idx;
 
   LLVM_DEBUG(dbgs() << "  Operand mapping:\n");
-  for (unsigned i = 0, e = Insn.Operands.size(); i != e; ++i) {
+  for (const auto &[Idx, Opnd] : enumerate(Insn.Operands)) {
     // We've already handled constant values. Just map instruction operands
     // here.
-    if (OperandMap[Insn.Operands[i].MIOperandNo].Kind != OpData::Operand)
+    if (OperandMap[Opnd.MIOperandNo].Kind != OpData::Operand)
       continue;
     StringMap<unsigned>::iterator SourceOp =
-        SourceOperands.find(Dag->getArgNameStr(i));
+        SourceOperands.find(Dag->getArgNameStr(Idx));
     if (SourceOp == SourceOperands.end())
       PrintFatalError(Rec, "In pseudo instruction '" + Rec->getName() +
-                               "', output operand '" + Dag->getArgNameStr(i) +
+                               "', output operand '" + Dag->getArgNameStr(Idx) +
                                "' has no matching source operand");
+    const auto &SrcOpnd = SourceInsn.Operands[SourceOp->getValue()];
+    if (Opnd.MINumOperands != SrcOpnd.MINumOperands)
+      PrintFatalError(
+          Rec,
+          "In pseudo instruction '" + Rec->getName() + "', output operand '" +
+              Opnd.Rec->getName() +
+              "' has a different number of sub operands than source operand '" +
+              SrcOpnd.Rec->getName() + "'");
+
     // Map the source operand to the destination operand index for each
     // MachineInstr operand.
-    for (unsigned I = 0, E = Insn.Operands[i].MINumOperands; I != E; ++I)
-      OperandMap[Insn.Operands[i].MIOperandNo + I].Data.Operand =
-          SourceOp->getValue();
+    for (unsigned I = 0, E = Opnd.MINumOperands; I != E; ++I)
+      OperandMap[Opnd.MIOperandNo + I].Data.Operand = SrcOpnd.MIOperandNo + I;
----------------
topperc wrote:

Yes MIOperandNo is flat. All of the sub-operands reach here. The indexing of OperandMap was always flat. We used to store `SourceOp->getValue()` which isn't flat. Now we convert `SourceOp->getValue()` to MIOperandNo + subidx for the source here.

https://github.com/llvm/llvm-project/pull/135886


More information about the llvm-commits mailing list