aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-11 21:07:31 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-11 21:07:31 +0000
commitd68ee525b94909513ec78399dae6daaa84b7144c (patch)
tree7d12dc602ab2bed2136b0f19bde0c604b603a58c
parentcfa58bc8a8fa369fe0650c4a1848100f7994ad89 (diff)
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234149 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/tree-ssa-coalesce.c34
2 files changed, 26 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c69c7533b3e..f3a73515480 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
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) \