]> granicus.if.org Git - clang/commitdiff
use best-fit instead of first-fit when reusing a MacroArgs object,
authorChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 06:36:46 +0000 (06:36 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 06:36:46 +0000 (06:36 +0000)
this speeds up Eonly on the testcase in PR5888 from 30.5s to 0.85s

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92203 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/MacroArgs.cpp

index 4883898e3cd0826461b9aba2b36630b9f49f8281..2f1a34c832972cb526fff6d1b08809402f41cfbb 100644 (file)
@@ -24,25 +24,34 @@ MacroArgs *MacroArgs::create(const MacroInfo *MI,
                              Preprocessor &PP) {
   assert(MI->isFunctionLike() &&
          "Can't have args for an object-like macro!");
-  MacroArgs *Result = 0;
+  MacroArgs **ResultEnt = 0;
+  unsigned ClosestMatch = ~0U;
   
   // See if we have an entry with a big enough argument list to reuse on the
   // free list.  If so, reuse it.
   for (MacroArgs **Entry = &PP.MacroArgCache; *Entry;
        Entry = &(*Entry)->ArgCache)
-    if ((*Entry)->NumUnexpArgTokens >= NumToks) {
-      Result = *Entry;
-      // Unlink this node from the preprocessors singly linked list.
-      *Entry = Result->ArgCache;
-      break;
+    if ((*Entry)->NumUnexpArgTokens >= NumToks &&
+        (*Entry)->NumUnexpArgTokens < ClosestMatch) {
+      ResultEnt = Entry;
+      
+      // If we have an exact match, use it.
+      if ((*Entry)->NumUnexpArgTokens == NumToks)
+        break;
+      // Otherwise, use the best fit.
+      ClosestMatch = (*Entry)->NumUnexpArgTokens;
     }
   
-  if (Result == 0) {
+  MacroArgs *Result;
+  if (ResultEnt == 0) {
     // Allocate memory for a MacroArgs object with the lexer tokens at the end.
     Result = (MacroArgs*)malloc(sizeof(MacroArgs) + NumToks*sizeof(Token));
     // Construct the MacroArgs object.
     new (Result) MacroArgs(NumToks, VarargsElided);
   } else {
+    Result = *ResultEnt;
+    // Unlink this node from the preprocessors singly linked list.
+    *ResultEnt = Result->ArgCache;
     Result->NumUnexpArgTokens = NumToks;
     Result->VarargsElided = VarargsElided;
   }