> gcc/ChangeLog: > > 2014-11-13 Martin Liska <mli...@suse.cz> > > * fibonacci_heap.h: New file. > * ipa-inline.c (update_edge_key): New heap API is used. > (update_caller_keys): Likewise. > (update_callee_keys): Likewise. > (lookup_recursive_calls): Likewise. > (recursive_inlining): Likewise. > (add_new_edges_to_heap): Likewise. > (heap_edge_removal_hook): Likewise. > (inline_small_functions): Likewise.
My C++-fu is not on par to properly review fibonaci_heap.h. Trevor, Richard, could you please comment? My only concer is about the amount of code this winds into that may be shared across instantiations in other way than via ICF :) Also I wonder if API compatibility with std:: heaps would be useful in future. (we can not use priority queue from libstdc++ because inliner actually need operation to decrease keys badness and to remove a key) > diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c > index 5c97815..1ce856f 100644 > --- a/gcc/ipa-inline.c > +++ b/gcc/ipa-inline.c > @@ -138,6 +138,10 @@ along with GCC; see the file COPYING3. If not see > #include "auto-profile.h" > #include "cilk.h" > #include "builtins.h" > +#include "fibonacci_heap.h" > + > +typedef fibonacci_heap <long, cgraph_edge> edge_heap_t; > +typedef fibonacci_node <long, cgraph_edge> edge_heap_node_t; The second can be just typedef of first, right? > > /* Statistics we collect about inlining algorithm. */ > static int overall_size; > @@ -1076,19 +1080,19 @@ edge_badness (struct cgraph_edge *edge, bool dump) > > /* Recompute badness of EDGE and update its key in HEAP if needed. */ > static inline void > -update_edge_key (fibheap_t heap, struct cgraph_edge *edge) > +update_edge_key (edge_heap_t *heap, struct cgraph_edge *edge) > { > int badness = edge_badness (edge, false); > if (edge->aux) > { > - fibnode_t n = (fibnode_t) edge->aux; > - gcc_checking_assert (n->data == edge); > + edge_heap_node_t *n = (edge_heap_node_t *) edge->aux; > + gcc_checking_assert (n->get_data () == edge); > > - /* fibheap_replace_key only decrease the keys. > + /* fibonacci_heap::replace_key only decrease the keys. > When we increase the key we do not update heap > and instead re-insert the element once it becomes > a minimum of heap. */ > - if (badness < n->key) > + if (badness < n->get_key ()) > { > if (dump_file && (dump_flags & TDF_DETAILS)) > { > @@ -1098,11 +1102,11 @@ update_edge_key (fibheap_t heap, struct cgraph_edge > *edge) > edge->caller->order, > xstrdup (edge->callee->name ()), > edge->callee->order, > - (int)n->key, > + (int)n->get_key (), > badness); > } > - fibheap_replace_key (heap, n, badness); > - gcc_checking_assert (n->key == badness); > + heap->replace_key (n, badness); One thing that can be "fixed" is that fibheap actually do not allow you to increase key (if you do so it will give bogus order). Perhaps replace_key should be called decrease_key ;) Otherwise the ipa-inline.c changes are OK. Honza