summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-coalesce.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2016-03-11 14:07:31 -0700
committerJeff Law <law@gcc.gnu.org>2016-03-11 14:07:31 -0700
commit015782a5aea37b0cd80b5f1888988d5c79398b81 (patch)
tree7d12dc602ab2bed2136b0f19bde0c604b603a58c /gcc/tree-ssa-coalesce.c
parent3edc5da4a6b61d9184f1211037ab669897d1eef2 (diff)
re PR tree-optimization/64058 (Performance degradation after r216304)
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
Diffstat (limited to 'gcc/tree-ssa-coalesce.c')
-rw-r--r--gcc/tree-ssa-coalesce.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c
index 6624e7e5a9b..e49876eac33 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -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) \