aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2019-09-19 15:13:21 +0200
committerMartin Liska <marxin@gcc.gnu.org>2019-09-19 13:13:21 +0000
commit37bc3aa0474f21b7a678b09951634de3205d014e (patch)
tree3f3a62dfc37024ffa5b6ab2333427a62151fbe4f /gcc
parentd9e736e7194b524c3624172b896d5ace9cb459aa (diff)
downloadgcc-37bc3aa0474f21b7a678b09951634de3205d014e.zip
gcc-37bc3aa0474f21b7a678b09951634de3205d014e.tar.gz
gcc-37bc3aa0474f21b7a678b09951634de3205d014e.tar.bz2
Speed up qsort in IPA ICF.
2019-09-19 Martin Liska <mliska@suse.cz> * ipa-icf.c (sort_sem_items_by_decl_uid): Simplify comparator. (sort_congruence_classes_by_decl_uid): Likewise. (sort_congruence_class_groups_by_decl_uid): Use std::pair for easier sorting. (sem_item_optimizer::merge_classes): Likewise. From-SVN: r275961
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/ipa-icf.c49
2 files changed, 24 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1810fe9..cbddb90 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2019-09-19 Martin Liska <mliska@suse.cz>
+
+ * ipa-icf.c (sort_sem_items_by_decl_uid): Simplify comparator.
+ (sort_congruence_classes_by_decl_uid): Likewise.
+ (sort_congruence_class_groups_by_decl_uid): Use std::pair for
+ easier sorting.
+ (sem_item_optimizer::merge_classes): Likewise.
+
2019-09-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/91812
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index c9c3cb4..59b7f8b 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -3350,13 +3350,7 @@ sort_sem_items_by_decl_uid (const void *a, const void *b)
int uid1 = DECL_UID (i1->decl);
int uid2 = DECL_UID (i2->decl);
-
- if (uid1 < uid2)
- return -1;
- else if (uid1 > uid2)
- return 1;
- else
- return 0;
+ return uid1 - uid2;
}
/* Sort pair of congruence_classes A and B by DECL_UID of the first member. */
@@ -3369,13 +3363,7 @@ sort_congruence_classes_by_decl_uid (const void *a, const void *b)
int uid1 = DECL_UID (c1->members[0]->decl);
int uid2 = DECL_UID (c2->members[0]->decl);
-
- if (uid1 < uid2)
- return -1;
- else if (uid1 > uid2)
- return 1;
- else
- return 0;
+ return uid1 - uid2;
}
/* Sort pair of congruence_class_groups A and B by
@@ -3384,20 +3372,11 @@ sort_congruence_classes_by_decl_uid (const void *a, const void *b)
static int
sort_congruence_class_groups_by_decl_uid (const void *a, const void *b)
{
- const congruence_class_group *g1
- = *(const congruence_class_group * const *)a;
- const congruence_class_group *g2
- = *(const congruence_class_group * const *)b;
-
- int uid1 = DECL_UID (g1->classes[0]->members[0]->decl);
- int uid2 = DECL_UID (g2->classes[0]->members[0]->decl);
-
- if (uid1 < uid2)
- return -1;
- else if (uid1 > uid2)
- return 1;
- else
- return 0;
+ const std::pair<congruence_class_group *, int> *g1
+ = *(const std::pair<congruence_class_group *, int> *const *) a;
+ const std::pair<congruence_class_group *, int> *g2
+ = *(const std::pair<congruence_class_group *, int> *const *) b;
+ return g1->second - g2->second;
}
/* After reduction is done, we can declare all items in a group
@@ -3445,10 +3424,14 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
}
}
- auto_vec <congruence_class_group *> classes (m_classes.elements ());
+ auto_vec<std::pair<congruence_class_group *, int> > classes (
+ m_classes.elements ());
for (hash_table<congruence_class_hash>::iterator it = m_classes.begin ();
it != m_classes.end (); ++it)
- classes.quick_push (*it);
+ {
+ int uid = DECL_UID ((*it)->classes[0]->members[0]->decl);
+ classes.quick_push (std::pair<congruence_class_group *, int> (*it, uid));
+ }
classes.qsort (sort_congruence_class_groups_by_decl_uid);
@@ -3470,11 +3453,11 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count)
}
unsigned int l;
- congruence_class_group *it;
+ std::pair<congruence_class_group *, int> *it;
FOR_EACH_VEC_ELT (classes, l, it)
- for (unsigned int i = 0; i < it->classes.length (); i++)
+ for (unsigned int i = 0; i < it->first->classes.length (); i++)
{
- congruence_class *c = it->classes[i];
+ congruence_class *c = it->first->classes[i];
if (c->members.length () == 1)
continue;