]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/64058 (Performance degradation after r216304)
authorJeff Law <law@redhat.com>
Fri, 11 Mar 2016 21:07:31 +0000 (14:07 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 11 Mar 2016 21:07:31 +0000 (14:07 -0700)
PR tree-optimization/64058
* tree-ssa-coalesce.c (struct coalesce_pair): Add new field INDEX.
(num_coalesce_pairs): Move up earlier in file.
(find_coalesce_pair): Initialize the INDEX field for each pair
discovered.
(compare_pairs): No longer sort on the elements in each pair.
Instead break ties with the index of the coalesce pair.

From-SVN: r234149

gcc/ChangeLog
gcc/tree-ssa-coalesce.c

index c69c7533b3e5ca0717d113ee11065bdaa073eb1a..f3a73515480c236b6bb4938ce4fcf1103de49aa4 100644 (file)
@@ -1,3 +1,13 @@
+2016-03-11  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/64058
+       * tree-ssa-coalesce.c (struct coalesce_pair): Add new field INDEX.
+       (num_coalesce_pairs): Move up earlier in file.
+       (find_coalesce_pair): Initialize the INDEX field for each pair
+       discovered.
+       (compare_pairs): No longer sort on the elements in each pair.
+       Instead break ties with the index of the coalesce pair.
+
 2016-03-11  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR target/70002
index 6624e7e5a9b6f85bca2efe04de9f92da6f6d3614..e49876eac3349374a3cd9240ad27a5652d783a82 100644 (file)
@@ -50,6 +50,11 @@ struct coalesce_pair
   int first_element;
   int second_element;
   int cost;
+
+  /* The order in which coalescing pairs are discovered is recorded in this
+     field, which is used as the final tie breaker when sorting coalesce
+     pairs.  */
+  int index;
 };
 
 /* Coalesce pair hashtable helpers.  */
@@ -254,6 +259,13 @@ delete_coalesce_list (coalesce_list *cl)
   free (cl);
 }
 
+/* Return the number of unique coalesce pairs in CL.  */
+
+static inline int
+num_coalesce_pairs (coalesce_list *cl)
+{
+  return cl->list->elements ();
+}
 
 /* Find a matching coalesce pair object in CL for the pair P1 and P2.  If
    one isn't found, return NULL if CREATE is false, otherwise create a new
@@ -290,6 +302,7 @@ find_coalesce_pair (coalesce_list *cl, int p1, int p2, bool create)
       pair->first_element = p.first_element;
       pair->second_element = p.second_element;
       pair->cost = 0;
+      pair->index = num_coalesce_pairs (cl);
       *slot = pair;
     }
 
@@ -343,29 +356,14 @@ compare_pairs (const void *p1, const void *p2)
   int result;
 
   result = (* pp1)->cost - (* pp2)->cost;
-  /* Since qsort does not guarantee stability we use the elements
-     as a secondary key.  This provides us with independence from
-     the host's implementation of the sorting algorithm.  */
+  /* And if everything else is equal, then sort based on which
+     coalesce pair was found first.  */
   if (result == 0)
-    {
-      result = (* pp2)->first_element - (* pp1)->first_element;
-      if (result == 0)
-       result = (* pp2)->second_element - (* pp1)->second_element;
-    }
+    result = (*pp2)->index - (*pp1)->index;
 
   return result;
 }
 
-
-/* Return the number of unique coalesce pairs in CL.  */
-
-static inline int
-num_coalesce_pairs (coalesce_list *cl)
-{
-  return cl->list->elements ();
-}
-
-
 /* Iterate over CL using ITER, returning values in PAIR.  */
 
 #define FOR_EACH_PARTITION_PAIR(PAIR, ITER, CL)                \