[llvm] r187026 - Split generated asm mnemonic matching table into a separate table for each asm variant.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Jul 24 12:00:08 PDT 2013


Nice!

On 24 July 2013 03:33, Craig Topper <craig.topper at gmail.com> wrote:
> Author: ctopper
> Date: Wed Jul 24 02:33:14 2013
> New Revision: 187026
>
> URL: http://llvm.org/viewvc/llvm-project?rev=187026&view=rev
> Log:
> Split generated asm mnemonic matching table into a separate table for each asm variant.
>
> This removes the need to store the asm variant in each row of the single table that existed before. Shaves ~16K off the size of X86AsmParser.o.
>
>
> Modified:
>     llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
>     llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
>     llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
>     llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
>     llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
>     llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>     llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetAsmParser.h?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCTargetAsmParser.h (original)
> +++ llvm/trunk/include/llvm/MC/MCTargetAsmParser.h Wed Jul 24 02:33:14 2013
> @@ -143,7 +143,7 @@ public:
>
>    /// mnemonicIsValid - This returns true if this is a valid mnemonic and false
>    /// otherwise.
> -  virtual bool mnemonicIsValid(StringRef Mnemonic) = 0;
> +  virtual bool mnemonicIsValid(StringRef Mnemonic, unsigned VariantID) = 0;
>
>    /// MatchAndEmitInstruction - Recognize a series of operands of a parsed
>    /// instruction as an actual MCInst and emit it to the specified MCStreamer.
>
> Modified: llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/MBlaze/AsmParser/MBlazeAsmParser.cpp Wed Jul 24 02:33:14 2013
> @@ -8,6 +8,7 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "MCTargetDesc/MBlazeBaseInfo.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/Twine.h"
>  #include "llvm/MC/MCExpr.h"
>
> Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Wed Jul 24 02:33:14 2013
> @@ -1501,7 +1501,7 @@ bool MipsAsmParser::
>  ParseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc,
>                   SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
>    // Check if we have valid mnemonic
> -  if (!mnemonicIsValid(Name)) {
> +  if (!mnemonicIsValid(Name, 0)) {
>      Parser.eatToEndOfStatement();
>      return Error(NameLoc, "Unknown instruction");
>    }
>
> Modified: llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp Wed Jul 24 02:33:14 2013
> @@ -18,6 +18,7 @@
>  #include "llvm/MC/MCParser/MCAsmLexer.h"
>  #include "llvm/MC/MCParser/MCAsmParser.h"
>  #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/StringSwitch.h"
>
> Modified: llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp Wed Jul 24 02:33:14 2013
> @@ -8,6 +8,7 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "MCTargetDesc/SystemZMCTargetDesc.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include "llvm/MC/MCContext.h"
>  #include "llvm/MC/MCExpr.h"
>  #include "llvm/MC/MCInst.h"
>
> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Wed Jul 24 02:33:14 2013
> @@ -9,6 +9,7 @@
>
>  #include "MCTargetDesc/X86BaseInfo.h"
>  #include "llvm/ADT/APFloat.h"
> +#include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
>  #include "llvm/ADT/StringSwitch.h"
>
> Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp?rev=187026&r1=187025&r2=187026&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Wed Jul 24 02:33:14 2013
> @@ -2658,7 +2658,7 @@ void AsmMatcherEmitter::run(raw_ostream
>       << "&Operands);\n";
>    OS << "  void convertToMapAndConstraints(unsigned Kind,\n                ";
>    OS << "           const SmallVectorImpl<MCParsedAsmOperand*> &Operands);\n";
> -  OS << "  bool mnemonicIsValid(StringRef Mnemonic);\n";
> +  OS << "  bool mnemonicIsValid(StringRef Mnemonic, unsigned VariantID);\n";
>    OS << "  unsigned MatchInstructionImpl(\n";
>    OS.indent(27);
>    OS << "const SmallVectorImpl<MCParsedAsmOperand*> &Operands,\n"
> @@ -2780,7 +2780,6 @@ void AsmMatcherEmitter::run(raw_ostream
>                 << " RequiredFeatures;\n";
>    OS << "    " << getMinimalTypeForRange(Info.Classes.size())
>                 << " Classes[" << MaxNumOperands << "];\n";
> -  OS << "    uint8_t AsmVariantID;\n\n";
>    OS << "    StringRef getMnemonic() const {\n";
>    OS << "      return StringRef(MnemonicTable + Mnemonic + 1,\n";
>    OS << "                       MnemonicTable[Mnemonic]);\n";
> @@ -2802,51 +2801,73 @@ void AsmMatcherEmitter::run(raw_ostream
>
>    OS << "} // end anonymous namespace.\n\n";
>
> -  OS << "static const MatchEntry MatchTable["
> -     << Info.Matchables.size() << "] = {\n";
> +  unsigned VariantCount = Target.getAsmParserVariantCount();
> +  for (unsigned VC = 0; VC != VariantCount; ++VC) {
> +    Record *AsmVariant = Target.getAsmParserVariant(VC);
> +    std::string CommentDelimiter =
> +      AsmVariant->getValueAsString("CommentDelimiter");
> +    std::string RegisterPrefix = AsmVariant->getValueAsString("RegisterPrefix");
> +    int AsmVariantNo = AsmVariant->getValueAsInt("Variant");
>
> -  for (std::vector<MatchableInfo*>::const_iterator it =
> -       Info.Matchables.begin(), ie = Info.Matchables.end();
> -       it != ie; ++it) {
> -    MatchableInfo &II = **it;
> -
> -    // Store a pascal-style length byte in the mnemonic.
> -    std::string LenMnemonic = char(II.Mnemonic.size()) + II.Mnemonic.str();
> -    OS << "  { " << StringTable.GetOrAddStringOffset(LenMnemonic, false)
> -       << " /* " << II.Mnemonic << " */, "
> -       << Target.getName() << "::"
> -       << II.getResultInst()->TheDef->getName() << ", "
> -       << II.ConversionFnKind << ", ";
> -
> -    // Write the required features mask.
> -    if (!II.RequiredFeatures.empty()) {
> -      for (unsigned i = 0, e = II.RequiredFeatures.size(); i != e; ++i) {
> -        if (i) OS << "|";
> -        OS << II.RequiredFeatures[i]->getEnumName();
> -      }
> -    } else
> -      OS << "0";
> +    OS << "static const MatchEntry MatchTable" << VC << "[] = {\n";
>
> -    OS << ", { ";
> -    for (unsigned i = 0, e = II.AsmOperands.size(); i != e; ++i) {
> -      MatchableInfo::AsmOperand &Op = II.AsmOperands[i];
> +    for (std::vector<MatchableInfo*>::const_iterator it =
> +         Info.Matchables.begin(), ie = Info.Matchables.end();
> +         it != ie; ++it) {
> +      MatchableInfo &II = **it;
> +      if (II.AsmVariantID != AsmVariantNo)
> +        continue;
> +
> +      // Store a pascal-style length byte in the mnemonic.
> +      std::string LenMnemonic = char(II.Mnemonic.size()) + II.Mnemonic.str();
> +      OS << "  { " << StringTable.GetOrAddStringOffset(LenMnemonic, false)
> +         << " /* " << II.Mnemonic << " */, "
> +         << Target.getName() << "::"
> +         << II.getResultInst()->TheDef->getName() << ", "
> +         << II.ConversionFnKind << ", ";
> +
> +      // Write the required features mask.
> +      if (!II.RequiredFeatures.empty()) {
> +        for (unsigned i = 0, e = II.RequiredFeatures.size(); i != e; ++i) {
> +          if (i) OS << "|";
> +          OS << II.RequiredFeatures[i]->getEnumName();
> +        }
> +      } else
> +        OS << "0";
> +
> +      OS << ", { ";
> +      for (unsigned i = 0, e = II.AsmOperands.size(); i != e; ++i) {
> +        MatchableInfo::AsmOperand &Op = II.AsmOperands[i];
>
> -      if (i) OS << ", ";
> -      OS << Op.Class->Name;
> +        if (i) OS << ", ";
> +        OS << Op.Class->Name;
> +      }
> +      OS << " }, },\n";
>      }
> -    OS << " }, " << II.AsmVariantID;
> -    OS << "},\n";
> -  }
>
> -  OS << "};\n\n";
> +    OS << "};\n\n";
> +  }
>
>    // A method to determine if a mnemonic is in the list.
>    OS << "bool " << Target.getName() << ClassName << "::\n"
> -     << "mnemonicIsValid(StringRef Mnemonic) {\n";
> +     << "mnemonicIsValid(StringRef Mnemonic, unsigned VariantID) {\n";
> +  OS << "  // Find the appropriate table for this asm variant.\n";
> +  OS << "  const MatchEntry *Start, *End;\n";
> +  OS << "  switch (VariantID) {\n";
> +  OS << "  default: // unreachable\n";
> +  for (unsigned VC = 0; VC != VariantCount; ++VC) {
> +    Record *AsmVariant = Target.getAsmParserVariant(VC);
> +    std::string CommentDelimiter =
> +      AsmVariant->getValueAsString("CommentDelimiter");
> +    std::string RegisterPrefix = AsmVariant->getValueAsString("RegisterPrefix");
> +    int AsmVariantNo = AsmVariant->getValueAsInt("Variant");
> +    OS << "  case " << AsmVariantNo << ": Start = MatchTable" << VC
> +       << "; End = array_endof(MatchTable" << VC << "); break;\n";
> +  }
> +  OS << "  }\n";
>    OS << "  // Search the table.\n";
>    OS << "  std::pair<const MatchEntry*, const MatchEntry*> MnemonicRange =\n";
> -  OS << "    std::equal_range(MatchTable, MatchTable+"
> -     << Info.Matchables.size() << ", Mnemonic, LessOpcode());\n";
> +  OS << "    std::equal_range(Start, End, Mnemonic, LessOpcode());\n";
>    OS << "  return MnemonicRange.first != MnemonicRange.second;\n";
>    OS << "}\n\n";
>
> @@ -2888,10 +2909,23 @@ void AsmMatcherEmitter::run(raw_ostream
>    OS << "  ErrorInfo = ~0U;\n";
>
>    // Emit code to search the table.
> +  OS << "  // Find the appropriate table for this asm variant.\n";
> +  OS << "  const MatchEntry *Start, *End;\n";
> +  OS << "  switch (VariantID) {\n";
> +  OS << "  default: // unreachable\n";
> +  for (unsigned VC = 0; VC != VariantCount; ++VC) {
> +    Record *AsmVariant = Target.getAsmParserVariant(VC);
> +    std::string CommentDelimiter =
> +      AsmVariant->getValueAsString("CommentDelimiter");
> +    std::string RegisterPrefix = AsmVariant->getValueAsString("RegisterPrefix");
> +    int AsmVariantNo = AsmVariant->getValueAsInt("Variant");
> +    OS << "  case " << AsmVariantNo << ": Start = MatchTable" << VC
> +       << "; End = array_endof(MatchTable" << VC << "); break;\n";
> +  }
> +  OS << "  }\n";
>    OS << "  // Search the table.\n";
>    OS << "  std::pair<const MatchEntry*, const MatchEntry*> MnemonicRange =\n";
> -  OS << "    std::equal_range(MatchTable, MatchTable+"
> -     << Info.Matchables.size() << ", Mnemonic, LessOpcode());\n\n";
> +  OS << "    std::equal_range(Start, End, Mnemonic, LessOpcode());\n\n";
>
>    OS << "  // Return a more specific error code if no mnemonics match.\n";
>    OS << "  if (MnemonicRange.first == MnemonicRange.second)\n";
> @@ -2905,7 +2939,6 @@ void AsmMatcherEmitter::run(raw_ostream
>    OS << "    assert(Mnemonic == it->getMnemonic());\n";
>
>    // Emit check that the subclasses match.
> -  OS << "    if (VariantID != it->AsmVariantID) continue;\n";
>    OS << "    bool OperandsValid = true;\n";
>    OS << "    for (unsigned i = 0; i != " << MaxNumOperands << "; ++i) {\n";
>    OS << "      if (i + 1 >= Operands.size()) {\n";
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list