From ebaf92c67dac4974f98a08f8096d3eb2f4edd09d Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 13 Jan 2012 03:16:35 +0000 Subject: [PATCH] Use uniqued StringInit pointers for lookups. This avoids a gazillion StringMap and dynamic_cast calls, making TableGen run 3x faster. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148091 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/TableGen/Record.h | 23 +++++++++++++---------- lib/TableGen/Record.cpp | 28 ++++++++-------------------- lib/TableGen/TGParser.cpp | 2 +- 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/include/llvm/TableGen/Record.h b/include/llvm/TableGen/Record.h index f9ade8f144c..5e9e28d44b8 100644 --- a/include/llvm/TableGen/Record.h +++ b/include/llvm/TableGen/Record.h @@ -757,7 +757,7 @@ class StringInit : public TypedInit { virtual void anchor(); public: - static StringInit *get(const std::string &V); + static StringInit *get(StringRef); const std::string &getValue() const { return Value; } @@ -800,7 +800,7 @@ class CodeInit : public Init { virtual void anchor(); public: - static CodeInit *get(const std::string &V); + static CodeInit *get(StringRef); const std::string &getValue() const { return Value; } @@ -1454,19 +1454,22 @@ public: return isTemplateArg(StringInit::get(Name.str())); } - const RecordVal *getValue(StringRef Name) const { + const RecordVal *getValue(const Init *Name) const { for (unsigned i = 0, e = Values.size(); i != e; ++i) - if (Values[i].getName() == Name) return &Values[i]; + if (Values[i].getNameInit() == Name) return &Values[i]; return 0; } - RecordVal *getValue(StringRef Name) { + const RecordVal *getValue(StringRef Name) const { + return getValue(StringInit::get(Name)); + } + RecordVal *getValue(const Init *Name) { for (unsigned i = 0, e = Values.size(); i != e; ++i) - if (Values[i].getName() == Name) return &Values[i]; + if (Values[i].getNameInit() == Name) return &Values[i]; return 0; } - - const RecordVal *getValue(Init *Name) const; - RecordVal *getValue(Init *Name); + RecordVal *getValue(StringRef Name) { + return getValue(StringInit::get(Name)); + } void addTemplateArg(Init *Name) { assert(!isTemplateArg(Name) && "Template arg already defined!"); @@ -1477,7 +1480,7 @@ public: } void addValue(const RecordVal &RV) { - assert(getValue(RV.getName()) == 0 && "Value already added!"); + assert(getValue(RV.getNameInit()) == 0 && "Value already added!"); Values.push_back(RV); if (Values.size() > 1) // Keep NAME at the end of the list. It makes record dumps a diff --git a/lib/TableGen/Record.cpp b/lib/TableGen/Record.cpp index 1d6131c6923..d328d893fd0 100644 --- a/lib/TableGen/Record.cpp +++ b/lib/TableGen/Record.cpp @@ -573,7 +573,7 @@ IntInit::convertInitializerBitRange(const std::vector &Bits) const { void StringInit::anchor() { } -StringInit *StringInit::get(const std::string &V) { +StringInit *StringInit::get(StringRef V) { typedef StringMap Pool; static Pool ThePool; @@ -584,7 +584,7 @@ StringInit *StringInit::get(const std::string &V) { void CodeInit::anchor() { } -CodeInit *CodeInit::get(const std::string &V) { +CodeInit *CodeInit::get(StringRef V) { typedef StringMap Pool; static Pool ThePool; @@ -1336,10 +1336,10 @@ const std::string &VarInit::getName() const { Init *VarInit::resolveBitReference(Record &R, const RecordVal *IRV, unsigned Bit) const { - if (R.isTemplateArg(getName())) return 0; - if (IRV && IRV->getName() != getName()) return 0; + if (R.isTemplateArg(getNameInit())) return 0; + if (IRV && IRV->getNameInit() != getNameInit()) return 0; - RecordVal *RV = R.getValue(getName()); + RecordVal *RV = R.getValue(getNameInit()); assert(RV && "Reference to a non-existent variable?"); assert(dynamic_cast(RV->getValue())); BitsInit *BI = (BitsInit*)RV->getValue(); @@ -1358,10 +1358,10 @@ Init *VarInit::resolveBitReference(Record &R, const RecordVal *IRV, Init *VarInit::resolveListElementReference(Record &R, const RecordVal *IRV, unsigned Elt) const { - if (R.isTemplateArg(getName())) return 0; - if (IRV && IRV->getName() != getName()) return 0; + if (R.isTemplateArg(getNameInit())) return 0; + if (IRV && IRV->getNameInit() != getNameInit()) return 0; - RecordVal *RV = R.getValue(getName()); + RecordVal *RV = R.getValue(getNameInit()); assert(RV && "Reference to a non-existent variable?"); ListInit *LI = dynamic_cast(RV->getValue()); if (!LI) { @@ -1759,18 +1759,6 @@ void Record::setName(const std::string &Name) { setName(StringInit::get(Name)); } -const RecordVal *Record::getValue(Init *Name) const { - for (unsigned i = 0, e = Values.size(); i != e; ++i) - if (Values[i].getNameInit() == Name) return &Values[i]; - return 0; -} - -RecordVal *Record::getValue(Init *Name) { - for (unsigned i = 0, e = Values.size(); i != e; ++i) - if (Values[i].getNameInit() == Name) return &Values[i]; - return 0; -} - /// resolveReferencesTo - If anything in this record refers to RV, replace the /// reference to RV with the RHS of RV. If RV is null, we resolve all possible /// references. diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index 8bcb029cbcf..5c13af18c6f 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -64,7 +64,7 @@ bool TGParser::AddValue(Record *CurRec, SMLoc Loc, const RecordVal &RV) { if (CurRec == 0) CurRec = &CurMultiClass->Rec; - if (RecordVal *ERV = CurRec->getValue(RV.getName())) { + if (RecordVal *ERV = CurRec->getValue(RV.getNameInit())) { // The value already exists in the class, treat this as a set. if (ERV->setValue(RV.getValue())) return Error(Loc, "New definition of '" + RV.getName() + "' of type '" + -- 2.34.1