diff options
author | Jeff Law <law@redhat.com> | 2016-03-11 14:07:31 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2016-03-11 14:07:31 -0700 |
commit | 015782a5aea37b0cd80b5f1888988d5c79398b81 (patch) | |
tree | 7d12dc602ab2bed2136b0f19bde0c604b603a58c /gcc/tree-ssa-coalesce.c | |
parent | 3edc5da4a6b61d9184f1211037ab669897d1eef2 (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.c | 34 |
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) \ |