OSDN Git Service

Use uniqued StringInit pointers for lookups.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 13 Jan 2012 03:16:35 +0000 (03:16 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 13 Jan 2012 03:16:35 +0000 (03:16 +0000)
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
lib/TableGen/Record.cpp
lib/TableGen/TGParser.cpp

index f9ade8f..5e9e28d 100644 (file)
@@ -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
index 1d6131c..d328d89 100644 (file)
@@ -573,7 +573,7 @@ IntInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) const {
 
 void StringInit::anchor() { }
 
-StringInit *StringInit::get(const std::string &V) {
+StringInit *StringInit::get(StringRef V) {
   typedef StringMap<StringInit *> 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<CodeInit *> 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<BitsInit*>(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<ListInit*>(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.
index 8bcb029..5c13af1 100644 (file)
@@ -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 '" +