Commit 015782a5 by Jeff Law Committed by Jeff Law

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
parent 3edc5da4
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> 2016-03-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/70002 PR target/70002
......
...@@ -50,6 +50,11 @@ struct coalesce_pair ...@@ -50,6 +50,11 @@ struct coalesce_pair
int first_element; int first_element;
int second_element; int second_element;
int cost; 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. */ /* Coalesce pair hashtable helpers. */
...@@ -254,6 +259,13 @@ delete_coalesce_list (coalesce_list *cl) ...@@ -254,6 +259,13 @@ delete_coalesce_list (coalesce_list *cl)
free (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 /* 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 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) ...@@ -290,6 +302,7 @@ find_coalesce_pair (coalesce_list *cl, int p1, int p2, bool create)
pair->first_element = p.first_element; pair->first_element = p.first_element;
pair->second_element = p.second_element; pair->second_element = p.second_element;
pair->cost = 0; pair->cost = 0;
pair->index = num_coalesce_pairs (cl);
*slot = pair; *slot = pair;
} }
...@@ -343,29 +356,14 @@ compare_pairs (const void *p1, const void *p2) ...@@ -343,29 +356,14 @@ compare_pairs (const void *p1, const void *p2)
int result; int result;
result = (* pp1)->cost - (* pp2)->cost; result = (* pp1)->cost - (* pp2)->cost;
/* Since qsort does not guarantee stability we use the elements /* And if everything else is equal, then sort based on which
as a secondary key. This provides us with independence from coalesce pair was found first. */
the host's implementation of the sorting algorithm. */
if (result == 0) if (result == 0)
{ result = (*pp2)->index - (*pp1)->index;
result = (* pp2)->first_element - (* pp1)->first_element;
if (result == 0)
result = (* pp2)->second_element - (* pp1)->second_element;
}
return result; 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. */ /* Iterate over CL using ITER, returning values in PAIR. */
#define FOR_EACH_PARTITION_PAIR(PAIR, ITER, CL) \ #define FOR_EACH_PARTITION_PAIR(PAIR, ITER, CL) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment