]> granicus.if.org Git - llvm/commitdiff
Revert "[TableGen] AsmMatcher: fix OpIdx computation when HasOptionalOperands is...
authorVitaly Buka <vitalybuka@google.com>
Fri, 4 Aug 2017 00:25:24 +0000 (00:25 +0000)
committerVitaly Buka <vitalybuka@google.com>
Fri, 4 Aug 2017 00:25:24 +0000 (00:25 +0000)
Breaks check-llvm under ubsan.

This reverts commit r309949.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310008 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/AsmMatcherEmitter.cpp

index 82d95b71885b78697e0afcbb9501c1a42b3b5634..1f8e1b125889fe64d75a6cebe9eb89af2a24dcf3 100644 (file)
@@ -1847,30 +1847,13 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
   CvtOS << "  assert(Kind < CVT_NUM_SIGNATURES && \"Invalid signature!\");\n";
   CvtOS << "  const uint8_t *Converter = ConversionTable[Kind];\n";
   if (HasOptionalOperands) {
-    size_t MaxNumOperands = 0;
-    for (const auto &MI : Infos) {
-      MaxNumOperands = std::max(MaxNumOperands, MI->AsmOperands.size());
-    }
-    CvtOS << "  unsigned DefaultsOffset[" << (MaxNumOperands) << "];\n";
-    CvtOS << "  assert(OptionalOperandsMask.size() == " << (MaxNumOperands)
-          << ");\n";
-    CvtOS << "  for (unsigned i = 0, NumDefaults = 0; i < " << (MaxNumOperands)
-          << "; ++i) {\n";
-    CvtOS << "    DefaultsOffset[i] = NumDefaults;\n";
-    CvtOS << "    NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
-    CvtOS << "  }\n";
+    CvtOS << "  unsigned NumDefaults = 0;\n";
   }
   CvtOS << "  unsigned OpIdx;\n";
   CvtOS << "  Inst.setOpcode(Opcode);\n";
   CvtOS << "  for (const uint8_t *p = Converter; *p; p+= 2) {\n";
   if (HasOptionalOperands) {
-    // OpIdx has different semantics for Tied operands and the rest of the
-    // operands. For Tied it is the index in the Inst, therefore we use it
-    // directly. For the rest of the operands, we need to account for the
-    // offset.
-    CvtOS << "    OpIdx = *(p + 1);\n";
-    CvtOS << "    OpIdx -= (*p != CVT_Tied) ? DefaultsOffset[*(p + 1) - 1] : "
-             "0;\n";
+    CvtOS << "    OpIdx = *(p + 1) - NumDefaults;\n";
   } else {
     CvtOS << "    OpIdx = *(p + 1);\n";
   }
@@ -2005,6 +1988,7 @@ static void emitConvertFuncs(CodeGenTarget &Target, StringRef ClassName,
                 << "        " << Op.Class->DefaultMethod << "()"
                 << "->" << Op.Class->RenderMethod << "(Inst, "
                 << OpInfo.MINumOperands << ");\n"
+                << "        ++NumDefaults;\n"
                 << "      } else {\n"
                 << "        static_cast<" << TargetOperandClass
                 << "&>(*Operands[OpIdx])." << Op.Class->RenderMethod