diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-10-17 16:18:09 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-10-17 16:18:09 +0000 |
| commit | 77dfde0ba3661f342d7ef5bcdf5448a4d66c6d4b (patch) | |
| tree | 90df6ac4cfb0ad2040f11a66a334d48dac6f5b37 | |
| parent | 9dda3e0d136c0555d0d913eca4cf7cf8051e0875 (diff) | |
| download | bcm5719-llvm-77dfde0ba3661f342d7ef5bcdf5448a4d66c6d4b.tar.gz bcm5719-llvm-77dfde0ba3661f342d7ef5bcdf5448a4d66c6d4b.zip | |
Pick low-hanging MatchEntry shrinkage fruit.
Shaves 200k off Release-Asserts clang binaries on i386.
llvm-svn: 142191
| -rw-r--r-- | llvm/utils/TableGen/AsmMatcherEmitter.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/llvm/utils/TableGen/AsmMatcherEmitter.cpp index 8b86c23d063..ba69aefac6b 100644 --- a/llvm/utils/TableGen/AsmMatcherEmitter.cpp +++ b/llvm/utils/TableGen/AsmMatcherEmitter.cpp @@ -1975,6 +1975,15 @@ static bool EmitMnemonicAliases(raw_ostream &OS, const AsmMatcherInfo &Info) { return true; } +static const char *getMinimalTypeForRange(uint64_t Range) { + assert(Range < 0xFFFFFFFFULL && "Enum too large"); + if (Range > 0xFFFF) + return "uint32_t"; + if (Range > 0xFF) + return "uint16_t"; + return "uint8_t"; +} + static void EmitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target, const AsmMatcherInfo &Info, StringRef ClassName) { // Emit the static custom operand parsing table; @@ -2262,9 +2271,12 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { OS << " struct MatchEntry {\n"; OS << " unsigned Opcode;\n"; OS << " const char *Mnemonic;\n"; - OS << " ConversionKind ConvertFn;\n"; - OS << " MatchClassKind Classes[" << MaxNumOperands << "];\n"; - OS << " unsigned RequiredFeatures;\n"; + OS << " " << getMinimalTypeForRange(Info.Matchables.size()) + << " ConvertFn;\n"; + OS << " " << getMinimalTypeForRange(Info.Classes.size()) + << " Classes[" << MaxNumOperands << "];\n"; + OS << " " << getMinimalTypeForRange(1ULL << Info.SubtargetFeatures.size()) + << " RequiredFeatures;\n"; OS << " };\n\n"; OS << " // Predicate for searching for an opcode.\n"; @@ -2384,7 +2396,8 @@ void AsmMatcherEmitter::run(raw_ostream &OS) { OS << " OperandsValid = (it->Classes[i] == " <<"InvalidMatchClass);\n"; OS << " break;\n"; OS << " }\n"; - OS << " if (ValidateOperandClass(Operands[i+1], it->Classes[i]))\n"; + OS << " if (ValidateOperandClass(Operands[i+1], " + "(MatchClassKind)it->Classes[i]))\n"; OS << " continue;\n"; OS << " // If this operand is broken for all of the instances of this\n"; OS << " // mnemonic, keep track of it so we can report loc info.\n"; |

