make the redeclaration case faster for the common instance of a redeclaration
where there is exactly one existing declaration.  This is common.

this speeds up clang about 3% on cocoa.h for me 0.165 -> 0.160s


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65096 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp
index 9b277fe..a35dcc2 100644
--- a/lib/AST/DeclBase.cpp
+++ b/lib/AST/DeclBase.cpp
@@ -566,15 +566,26 @@
     return;
   }
 
+  // If it is possible that this is a redeclaration, check to see if there is
+  // already a decl for which declarationReplaces returns true.  If there is
+  // one, just replace it and return.
   if (MayBeRedeclaration) {
-    // Determine if this declaration is actually a redeclaration.
-    std::vector<NamedDecl *>::iterator Redecl
-      = std::find_if(DeclNameEntries.begin(), DeclNameEntries.end(),
-                   std::bind1st(std::mem_fun(&NamedDecl::declarationReplaces),
-                                D));
-    if (Redecl != DeclNameEntries.end()) {
-      *Redecl = D;
-      return;
+    // Most decls only have one entry in their list, special case it.
+    if (DeclNameEntries.size() == 1) {
+      if (D->declarationReplaces(DeclNameEntries[0])) {
+        DeclNameEntries[0] = D;
+        return;
+      }
+    } else {
+      // Determine if this declaration is actually a redeclaration.
+      std::vector<NamedDecl *>::iterator Redecl
+        = std::find_if(DeclNameEntries.begin(), DeclNameEntries.end(),
+                     std::bind1st(std::mem_fun(&NamedDecl::declarationReplaces),
+                                  D));
+      if (Redecl != DeclNameEntries.end()) {
+        *Redecl = D;
+        return;
+      }
     }
   }