From 4762c0b5d11f0de20aafd3e9310d9fc565497bd3 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Wed, 11 Feb 2015 07:43:56 +0000 Subject: [PATCH] AsmParser: Switch some vectors to maps This speeds up parsing .ll files with metadata nodes with large IDs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228812 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AsmParser/LLParser.cpp | 29 ++++++++++------------------- lib/AsmParser/LLParser.h | 4 ++-- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 99be044d865..25b2a315023 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -117,10 +117,10 @@ bool LLParser::ValidateEndOfModule() { return Error(ForwardRefBlockAddresses.begin()->first.Loc, "expected function name in blockaddress"); - for (unsigned i = 0, e = NumberedTypes.size(); i != e; ++i) - if (NumberedTypes[i].second.isValid()) - return Error(NumberedTypes[i].second, - "use of undefined type '%" + Twine(i) + "'"); + for (const auto &NT : NumberedTypes) + if (NT.second.second.isValid()) + return Error(NT.second.second, + "use of undefined type '%" + Twine(NT.first) + "'"); for (StringMap >::iterator I = NamedTypes.begin(), E = NamedTypes.end(); I != E; ++I) @@ -149,9 +149,10 @@ bool LLParser::ValidateEndOfModule() { Twine(ForwardRefMDNodes.begin()->first) + "'"); // Resolve metadata cycles. - for (auto &N : NumberedMetadata) - if (N && !N->isResolved()) - N->resolveCycles(); + for (auto &N : NumberedMetadata) { + if (N.second && !N.second->isResolved()) + N.second->resolveCycles(); + } // Look for intrinsic functions and CallInst that need to be upgraded for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ) @@ -304,9 +305,6 @@ bool LLParser::ParseUnnamedType() { ParseToken(lltok::kw_type, "expected 'type' after '='")) return true; - if (TypeID >= NumberedTypes.size()) - NumberedTypes.resize(TypeID+1); - Type *Result = nullptr; if (ParseStructDefinition(TypeLoc, "", NumberedTypes[TypeID], Result)) return true; @@ -527,7 +525,7 @@ bool LLParser::ParseMDNodeID(MDNode *&Result) { return true; // If not a forward reference, just return it now. - if (MID < NumberedMetadata.size() && NumberedMetadata[MID] != nullptr) { + if (NumberedMetadata.count(MID)) { Result = NumberedMetadata[MID]; return false; } @@ -536,8 +534,6 @@ bool LLParser::ParseMDNodeID(MDNode *&Result) { auto &FwdRef = ForwardRefMDNodes[MID]; FwdRef = std::make_pair(MDTuple::getTemporary(Context, None), Lex.getLoc()); - if (NumberedMetadata.size() <= MID) - NumberedMetadata.resize(MID+1); Result = FwdRef.first.get(); NumberedMetadata[MID].reset(Result); return false; @@ -604,10 +600,7 @@ bool LLParser::ParseStandaloneMetadata() { assert(NumberedMetadata[MetadataID] == Init && "Tracking VH didn't work"); } else { - if (MetadataID >= NumberedMetadata.size()) - NumberedMetadata.resize(MetadataID+1); - - if (NumberedMetadata[MetadataID] != nullptr) + if (NumberedMetadata.count(MetadataID)) return TokError("Metadata id is already used"); NumberedMetadata[MetadataID].reset(Init); } @@ -1704,8 +1697,6 @@ bool LLParser::ParseType(Type *&Result, const Twine &Msg, bool AllowVoid) { case lltok::LocalVarID: { // Type ::= %4 - if (Lex.getUIntVal() >= NumberedTypes.size()) - NumberedTypes.resize(Lex.getUIntVal()+1); std::pair &Entry = NumberedTypes[Lex.getUIntVal()]; // If the type hasn't been defined yet, create a forward definition and diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index a45e446cce8..368c3054b19 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -108,9 +108,9 @@ namespace llvm { // Type resolution handling data structures. The location is set when we // have processed a use of the type but not a definition yet. StringMap > NamedTypes; - std::vector > NumberedTypes; + std::map > NumberedTypes; - std::vector NumberedMetadata; + std::map NumberedMetadata; std::map> ForwardRefMDNodes; // Global Value reference information. -- 2.11.0