This is second part which has not a significant speed up but it's mentioned in the Value Numbering algorithm as a useful heuristics.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin gcc/ChangeLog: 2019-06-03 Martin Liska <mli...@suse.cz> * ipa-icf.c (sem_item_optimizer::add_item_to_class): Count number of references. (sem_item_optimizer::do_congruence_step): (sem_item_optimizer::worklist_push): Dump how references a class has. (sem_item_optimizer::worklist_pop): Use heap. (sem_item_optimizer::process_cong_reduction): Likewise. * ipa-icf.h: Use fibonacci_heap insteam of std::list. --- gcc/ipa-icf.c | 12 +++++++----- gcc/ipa-icf.h | 8 ++++++-- 2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index a4705eee936..ac563623ea2 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -80,6 +80,7 @@ along with GCC; see the file COPYING3. If not see #include "print-tree.h" #include "ipa-utils.h" #include "ipa-icf-gimple.h" +#include "fibonacci_heap.h" #include "ipa-icf.h" #include "stor-layout.h" #include "dbgcnt.h" @@ -2626,6 +2627,7 @@ sem_item_optimizer::add_item_to_class (congruence_class *cls, sem_item *item) { item->index_in_class = cls->members.length (); cls->members.safe_push (item); + cls->referenced_by_count += item->referenced_by_count; item->cls = cls; } @@ -3188,7 +3190,8 @@ sem_item_optimizer::do_congruence_step (congruence_class *cls) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, " processing congruence step for class: %u " - "(%u items), index: %u\n", cls->id, cls->members.length (), i); + "(%u items, %u references), index: %u\n", cls->id, + cls->referenced_by_count, cls->members.length (), i); do_congruence_step_for_index (cls, i); if (splitter_class_removed) @@ -3208,7 +3211,7 @@ sem_item_optimizer::worklist_push (congruence_class *cls) return; cls->in_worklist = true; - worklist.push_back (cls); + worklist.insert (cls->referenced_by_count, cls); } /* Pops a class from worklist. */ @@ -3220,8 +3223,7 @@ sem_item_optimizer::worklist_pop (void) while (!worklist.empty ()) { - cls = worklist.front (); - worklist.pop_front (); + cls = worklist.extract_min (); if (cls->in_worklist) { cls->in_worklist = false; @@ -3253,7 +3255,7 @@ sem_item_optimizer::process_cong_reduction (void) if (dump_file) fprintf (dump_file, "Worklist has been filled with: %lu\n", - (unsigned long) worklist.size ()); + (unsigned long) worklist.nodes ()); if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Congruence class reduction\n"); diff --git a/gcc/ipa-icf.h b/gcc/ipa-icf.h index ede4c94dbd3..6b81eb38b2a 100644 --- a/gcc/ipa-icf.h +++ b/gcc/ipa-icf.h @@ -29,7 +29,8 @@ class congruence_class { public: /* Congruence class constructor for a new class with _ID. */ - congruence_class (unsigned int _id): in_worklist (false), id(_id) + congruence_class (unsigned int _id): in_worklist (false), id (_id), + referenced_by_count (0) { } @@ -54,6 +55,9 @@ public: /* Global unique class identifier. */ unsigned int id; + + /* Total number of references to items of this class. */ + unsigned referenced_by_count; }; /* Semantic item type enum. */ @@ -530,7 +534,7 @@ public: /* Worklist of congruence classes that can potentially refine classes of congruence. */ - std::list<congruence_class *> worklist; + fibonacci_heap<unsigned, congruence_class> worklist; /* Remove semantic ITEM and release memory. */ void remove_item (sem_item *item);