diff options
author | Richard Biener <rguenther@suse.de> | 2019-01-02 08:49:07 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-01-02 08:49:07 +0000 |
commit | 9e1f4e00169f251d6777a6e594fb88fd581184f3 (patch) | |
tree | 2c0a74341db1c1513b9bdc85ef7bc8d3e648d847 /gcc/ipa-icf.c | |
parent | eef2da674ab7e8a9551e656e649359c2b27b026d (diff) |
re PR lto/85574 (LTO bootstapped binaries differ)
2019-01-02 Richard Biener <rguenther@suse.de>
PR ipa/85574
* ipa-icf.h (sem_item_optimizer::sort_congruence_split): Declare.
* ipa-icf.c (sem_item_optimizer::sort_congruence_split): New
function.
(sem_item_optimizer::do_congruence_step_f): Sort the congruence
set after UIDs before splitting them.
From-SVN: r267506
Diffstat (limited to 'gcc/ipa-icf.c')
-rw-r--r-- | gcc/ipa-icf.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 6701931ecbd..ebaf5825e1e 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -3117,6 +3117,22 @@ sem_item_optimizer::traverse_congruence_split (congruence_class * const &cls, return true; } +/* Compare function for sorting pairs in do_congruence_step_f. */ + +int +sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_) +{ + const std::pair<congruence_class *, bitmap> *a + = (const std::pair<congruence_class *, bitmap> *)a_; + const std::pair<congruence_class *, bitmap> *b + = (const std::pair<congruence_class *, bitmap> *)b_; + if (a->first->id < b->first->id) + return -1; + else if (a->first->id > b->first->id) + return 1; + return 0; +} + /* Tests if a class CLS used as INDEXth splits any congruence classes. Bitmap stack BMSTACK is used for bitmap allocation. */ @@ -3157,13 +3173,20 @@ sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls, } } + auto_vec<std::pair<congruence_class *, bitmap> > to_split; + to_split.reserve_exact (split_map.elements ()); + for (hash_map <congruence_class *, bitmap>::iterator i = split_map.begin (); + i != split_map.end (); ++i) + to_split.safe_push (*i); + to_split.qsort (sort_congruence_split); + traverse_split_pair pair; pair.optimizer = this; pair.cls = cls; splitter_class_removed = false; - split_map.traverse <traverse_split_pair *, - sem_item_optimizer::traverse_congruence_split> (&pair); + for (unsigned i = 0; i < to_split.length (); ++i) + traverse_congruence_split (to_split[i].first, to_split[i].second, &pair); /* Bitmap clean-up. */ split_map.traverse <traverse_split_pair *, |