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>
PR target/70002
......
......@@ -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) \
......
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