[09/14] Remove cgraph_node::summary_uid and make cgraph_node::uid really unique.

Message ID 9ea573c8288da886c1eaf19946ee1ac373026fe5.1526551813.git.mliska@suse.cz
State New
Headers show
Series
  • Finish transition of {symbol,call}_summary.
Related show

Commit Message

Martin Liška April 20, 2018, 1:28 p.m.
gcc/ChangeLog:

2018-05-16  Martin Liska  <mliska@suse.cz>

	* cgraph.c (cgraph_node::remove): Do not recycle uid.
	* cgraph.h (symbol_table::release_symbol): Do not pass uid.
	(symbol_table::allocate_cgraph_symbol): Do not set uid.
	* passes.c (uid_hash_t): Record removed_nodes by their uids.
	(remove_cgraph_node_from_order): Use the removed_nodes set.
	(do_per_function_toporder): Likwise.
	* symbol-summary.h (symtab_insertion): Use cgraph_node::uid
	instead of summary_uid.
	(symtab_removal): Likewise.
	(symtab_duplication): Likewise.

gcc/lto/ChangeLog:

2018-05-16  Martin Liska  <mliska@suse.cz>

	* lto-partition.c (lto_balanced_map): Use cgraph_node::uid
	instead of summary_uid.
---
 gcc/cgraph.c            |  3 +--
 gcc/cgraph.h            | 20 ++++++--------------
 gcc/lto/lto-partition.c | 26 +++++++++++---------------
 gcc/passes.c            | 37 ++++++++++++-------------------------
 gcc/symbol-summary.h    | 18 +++++++++---------
 5 files changed, 39 insertions(+), 65 deletions(-)

Comments

Jan Hubicka June 7, 2018, 12:09 p.m. | #1
> 

> gcc/ChangeLog:

> 

> 2018-05-16  Martin Liska  <mliska@suse.cz>

> 

> 	* cgraph.c (cgraph_node::remove): Do not recycle uid.

> 	* cgraph.h (symbol_table::release_symbol): Do not pass uid.

> 	(symbol_table::allocate_cgraph_symbol): Do not set uid.

> 	* passes.c (uid_hash_t): Record removed_nodes by their uids.

> 	(remove_cgraph_node_from_order): Use the removed_nodes set.

> 	(do_per_function_toporder): Likwise.

> 	* symbol-summary.h (symtab_insertion): Use cgraph_node::uid

> 	instead of summary_uid.

> 	(symtab_removal): Likewise.

> 	(symtab_duplication): Likewise.

> 

> gcc/lto/ChangeLog:

> 

> 2018-05-16  Martin Liska  <mliska@suse.cz>

> 

> 	* lto-partition.c (lto_balanced_map): Use cgraph_node::uid

> 	instead of summary_uid.


I am still now convinced that competely moving from arrays made dense by
uid recyclic to hash tables is performance-wise smart idea, but current
uid is not working very well for this purpose - most summaries we have
are only for definitions so we want something like definition uid.

In general it seems bad that we allocate same memory for object with definition
and external symbol. Something I planned to change but did not get to do that yet.

So the patch is OK. With new abstraction we can always re-invent dense uids for
this purpose later.

Honza
Christophe Lyon June 8, 2018, 7:58 p.m. | #2
On 7 June 2018 at 14:09, Jan Hubicka <hubicka@ucw.cz> wrote:
>>

>> gcc/ChangeLog:

>>

>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>

>>       * cgraph.c (cgraph_node::remove): Do not recycle uid.

>>       * cgraph.h (symbol_table::release_symbol): Do not pass uid.

>>       (symbol_table::allocate_cgraph_symbol): Do not set uid.

>>       * passes.c (uid_hash_t): Record removed_nodes by their uids.

>>       (remove_cgraph_node_from_order): Use the removed_nodes set.

>>       (do_per_function_toporder): Likwise.

>>       * symbol-summary.h (symtab_insertion): Use cgraph_node::uid

>>       instead of summary_uid.

>>       (symtab_removal): Likewise.

>>       (symtab_duplication): Likewise.

>>

>> gcc/lto/ChangeLog:

>>

>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>

>>       * lto-partition.c (lto_balanced_map): Use cgraph_node::uid

>>       instead of summary_uid.

>

> I am still now convinced that competely moving from arrays made dense by

> uid recyclic to hash tables is performance-wise smart idea, but current

> uid is not working very well for this purpose - most summaries we have

> are only for definitions so we want something like definition uid.

>

> In general it seems bad that we allocate same memory for object with definition

> and external symbol. Something I planned to change but did not get to do that yet.

>

> So the patch is OK. With new abstraction we can always re-invent dense uids for

> this purpose later.

>

> Honza



Hi!

This patch broke the GCC build:
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:
In function ‘void remove_cgraph_node_from_order(cgraph_node*, void*)’:
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
warning: ‘>>’ operator will be treated as two right angle brackets in
C++0x
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
warning: suggest parentheses around ‘>>’ expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: ‘removed_nodes’ was not declared in this scope
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: ‘*’ cannot appear in a constant-expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
warning: ‘>>’ operator will be treated as two right angle brackets in
C++0x
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
warning: suggest parentheses around ‘>>’ expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: ‘*’ cannot appear in a constant-expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 3 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 1 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 2 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: an assignment cannot appear in a constant-expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 3 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 1 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:
error: template argument 2 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:
In function ‘void do_per_function_toporder(void (*)(function*, void*),
void*)’:
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
warning: ‘>>’ operator will be treated as two right angle brackets in
C++0x
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
warning: suggest parentheses around ‘>>’ expression
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
error: ‘removed_nodes’ was not declared in this scope
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
error: template argument 3 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
error: template argument 1 is invalid
/tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:
error: template argument 2 is invalid
make[2]: *** [passes.o] Error 1
Martin Liška June 8, 2018, 8:05 p.m. | #3
On 06/08/2018 09:58 PM, Christophe Lyon wrote:
> On 7 June 2018 at 14:09, Jan Hubicka <hubicka@ucw.cz> wrote:

>>>

>>> gcc/ChangeLog:

>>>

>>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>>

>>>        * cgraph.c (cgraph_node::remove): Do not recycle uid.

>>>        * cgraph.h (symbol_table::release_symbol): Do not pass uid.

>>>        (symbol_table::allocate_cgraph_symbol): Do not set uid.

>>>        * passes.c (uid_hash_t): Record removed_nodes by their uids.

>>>        (remove_cgraph_node_from_order): Use the removed_nodes set.

>>>        (do_per_function_toporder): Likwise.

>>>        * symbol-summary.h (symtab_insertion): Use cgraph_node::uid

>>>        instead of summary_uid.

>>>        (symtab_removal): Likewise.

>>>        (symtab_duplication): Likewise.

>>>

>>> gcc/lto/ChangeLog:

>>>

>>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>>

>>>        * lto-partition.c (lto_balanced_map): Use cgraph_node::uid

>>>        instead of summary_uid.

>>

>> I am still now convinced that competely moving from arrays made dense by

>> uid recyclic to hash tables is performance-wise smart idea, but current

>> uid is not working very well for this purpose - most summaries we have

>> are only for definitions so we want something like definition uid.

>>

>> In general it seems bad that we allocate same memory for object with definition

>> and external symbol. Something I planned to change but did not get to do that yet.

>>

>> So the patch is OK. With new abstraction we can always re-invent dense uids for

>> this purpose later.

>>

>> Honza

> 

> 

> Hi!

> 

> This patch broke the GCC build:


Sorry for that. It was just short breakage, it's fixed in r261320.

Martin

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:

> In function ‘void remove_cgraph_node_from_order(cgraph_node*, void*)’:

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> warning: ‘>>’ operator will be treated as two right angle brackets in

> C++0x

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> warning: suggest parentheses around ‘>>’ expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: ‘removed_nodes’ was not declared in this scope

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: ‘*’ cannot appear in a constant-expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> warning: ‘>>’ operator will be treated as two right angle brackets in

> C++0x

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> warning: suggest parentheses around ‘>>’ expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: ‘*’ cannot appear in a constant-expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 3 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 1 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 2 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: an assignment cannot appear in a constant-expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 3 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 1 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

> error: template argument 2 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:

> In function ‘void do_per_function_toporder(void (*)(function*, void*),

> void*)’:

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> warning: ‘>>’ operator will be treated as two right angle brackets in

> C++0x

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> warning: suggest parentheses around ‘>>’ expression

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> error: ‘removed_nodes’ was not declared in this scope

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> error: template argument 3 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> error: template argument 1 is invalid

> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

> error: template argument 2 is invalid

> make[2]: *** [passes.o] Error 1

>
Christophe Lyon June 8, 2018, 8:53 p.m. | #4
On 8 June 2018 at 22:05, Martin Liška <mliska@suse.cz> wrote:
> On 06/08/2018 09:58 PM, Christophe Lyon wrote:

>>

>> On 7 June 2018 at 14:09, Jan Hubicka <hubicka@ucw.cz> wrote:

>>>>

>>>>

>>>> gcc/ChangeLog:

>>>>

>>>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>>>

>>>>        * cgraph.c (cgraph_node::remove): Do not recycle uid.

>>>>        * cgraph.h (symbol_table::release_symbol): Do not pass uid.

>>>>        (symbol_table::allocate_cgraph_symbol): Do not set uid.

>>>>        * passes.c (uid_hash_t): Record removed_nodes by their uids.

>>>>        (remove_cgraph_node_from_order): Use the removed_nodes set.

>>>>        (do_per_function_toporder): Likwise.

>>>>        * symbol-summary.h (symtab_insertion): Use cgraph_node::uid

>>>>        instead of summary_uid.

>>>>        (symtab_removal): Likewise.

>>>>        (symtab_duplication): Likewise.

>>>>

>>>> gcc/lto/ChangeLog:

>>>>

>>>> 2018-05-16  Martin Liska  <mliska@suse.cz>

>>>>

>>>>        * lto-partition.c (lto_balanced_map): Use cgraph_node::uid

>>>>        instead of summary_uid.

>>>

>>>

>>> I am still now convinced that competely moving from arrays made dense by

>>> uid recyclic to hash tables is performance-wise smart idea, but current

>>> uid is not working very well for this purpose - most summaries we have

>>> are only for definitions so we want something like definition uid.

>>>

>>> In general it seems bad that we allocate same memory for object with

>>> definition

>>> and external symbol. Something I planned to change but did not get to do

>>> that yet.

>>>

>>> So the patch is OK. With new abstraction we can always re-invent dense

>>> uids for

>>> this purpose later.

>>>

>>> Honza

>>

>>

>>

>> Hi!

>>

>> This patch broke the GCC build:

>

>

> Sorry for that. It was just short breakage, it's fixed in r261320.

>


OK, good to know. My build queue hasn't reached that stage yet :)

Thanks

> Martin

>

>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:

>> In function ‘void remove_cgraph_node_from_order(cgraph_node*, void*)’:

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> warning: ‘>>’ operator will be treated as two right angle brackets in

>> C++0x

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> warning: suggest parentheses around ‘>>’ expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: ‘removed_nodes’ was not declared in this scope

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: ‘*’ cannot appear in a constant-expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> warning: ‘>>’ operator will be treated as two right angle brackets in

>> C++0x

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> warning: suggest parentheses around ‘>>’ expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: ‘*’ cannot appear in a constant-expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 3 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 1 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 2 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: an assignment cannot appear in a constant-expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 3 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 1 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1646:

>> error: template argument 2 is invalid

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:

>> In function ‘void do_per_function_toporder(void (*)(function*, void*),

>> void*)’:

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> warning: ‘>>’ operator will be treated as two right angle brackets in

>> C++0x

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> warning: suggest parentheses around ‘>>’ expression

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> error: ‘removed_nodes’ was not declared in this scope

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> error: template argument 3 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> error: template argument 1 is invalid

>>

>> /tmp/9400570_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/passes.c:1664:

>> error: template argument 2 is invalid

>> make[2]: *** [passes.o] Error 1

>>

>

Patch

diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 9a7d54d7cee..a24a5ffe521 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1805,7 +1805,6 @@  void
 cgraph_node::remove (void)
 {
   cgraph_node *n;
-  int uid = this->uid;
 
   if (symtab->ipa_clones_dump_file && symtab->cloned_nodes.contains (this))
     fprintf (symtab->ipa_clones_dump_file,
@@ -1907,7 +1906,7 @@  cgraph_node::remove (void)
       instrumented_version = NULL;
     }
 
-  symtab->release_symbol (this, uid);
+  symtab->release_symbol (this);
 }
 
 /* Likewise indicate that a node is having address taken.  */
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index ee7ebb41c24..0e3b1a1785e 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -1396,8 +1396,6 @@  public:
   int count_materialization_scale;
   /* Unique id of the node.  */
   int uid;
-  /* Summary unique id of the node.  */
-  int summary_uid;
   /* ID assigned by the profiling.  */
   unsigned int profile_id;
   /* Time profiler: first run of function.  */
@@ -2020,7 +2018,7 @@  public:
   friend class cgraph_node;
   friend class cgraph_edge;
 
-  symbol_table (): cgraph_max_summary_uid (1)
+  symbol_table (): cgraph_max_uid (1)
   {
   }
 
@@ -2080,9 +2078,8 @@  public:
   /* Allocate new callgraph node and insert it into basic data structures.  */
   cgraph_node *create_empty (void);
 
-  /* Release a callgraph NODE with UID and put in to the list
-     of free nodes.  */
-  void release_symbol (cgraph_node *node, int uid);
+  /* Release a callgraph NODE.  */
+  void release_symbol (cgraph_node *node);
 
   /* Output all variables enqueued to be assembled.  */
   bool output_variables (void);
@@ -2230,7 +2227,6 @@  public:
 
   int cgraph_count;
   int cgraph_max_uid;
-  int cgraph_max_summary_uid;
 
   int edges_count;
   int edges_max_uid;
@@ -2598,7 +2594,7 @@  symbol_table::unregister (symtab_node *node)
 /* Release a callgraph NODE with UID and put in to the list of free nodes.  */
 
 inline void
-symbol_table::release_symbol (cgraph_node *node, int uid)
+symbol_table::release_symbol (cgraph_node *node)
 {
   cgraph_count--;
 
@@ -2606,7 +2602,6 @@  symbol_table::release_symbol (cgraph_node *node, int uid)
      list.  */
   memset (node, 0, sizeof (*node));
   node->type = SYMTAB_FUNCTION;
-  node->uid = uid;
   SET_NEXT_FREE_NODE (node, free_nodes);
   free_nodes = node;
 }
@@ -2624,12 +2619,9 @@  symbol_table::allocate_cgraph_symbol (void)
       free_nodes = NEXT_FREE_NODE (node);
     }
   else
-    {
-      node = ggc_cleared_alloc<cgraph_node> ();
-      node->uid = cgraph_max_uid++;
-    }
+    node = ggc_cleared_alloc<cgraph_node> ();
 
-  node->summary_uid = cgraph_max_summary_uid++;
+  node->uid = cgraph_max_uid++;
   return node;
 }
 
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 76086a2ba2e..9049a372256 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -506,12 +506,10 @@  account_reference_p (symtab_node *n1, symtab_node *n2)
 void
 lto_balanced_map (int n_lto_partitions, int max_partition_size)
 {
-  int n_nodes = 0;
   int n_varpool_nodes = 0, varpool_pos = 0, best_varpool_pos = 0;
-  struct cgraph_node **order = XNEWVEC (cgraph_node *, symtab->cgraph_max_uid);
+  auto_vec <cgraph_node *> order (symtab->cgraph_count);
   auto_vec<cgraph_node *> noreorder;
   auto_vec<varpool_node *> varpool_order;
-  int i;
   struct cgraph_node *node;
   int64_t original_total_size, total_size = 0;
   int64_t partition_size;
@@ -519,7 +517,7 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
   int last_visited_node = 0;
   varpool_node *vnode;
   int64_t cost = 0, internal = 0;
-  int best_n_nodes = 0, best_i = 0;
+  unsigned int best_n_nodes = 0, best_i = 0;
   int64_t best_cost = -1, best_internal = 0, best_size = 0;
   int npartitions;
   int current_order = -1;
@@ -527,14 +525,14 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 
   FOR_EACH_VARIABLE (vnode)
     gcc_assert (!vnode->aux);
-    
+
   FOR_EACH_DEFINED_FUNCTION (node)
     if (node->get_partitioning_class () == SYMBOL_PARTITION)
       {
 	if (node->no_reorder)
 	  noreorder.safe_push (node);
 	else
-	  order[n_nodes++] = node;
+	  order.safe_push (node);
 	if (!node->alias)
 	  total_size += ipa_fn_summaries->get_create (node)->size;
       }
@@ -546,15 +544,15 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
      unit tends to import a lot of global trees defined there.  We should
      get better about minimizing the function bounday, but until that
      things works smoother if we order in source order.  */
-  qsort (order, n_nodes, sizeof (struct cgraph_node *), node_cmp);
+  order.qsort (node_cmp);
   noreorder.qsort (node_cmp);
 
   if (symtab->dump_file)
     {
-      for(i = 0; i < n_nodes; i++)
+      for (unsigned i = 0; i < order.length (); i++)
 	fprintf (symtab->dump_file, "Balanced map symbol order:%s:%u\n",
 		 order[i]->name (), order[i]->tp_first_run);
-      for(i = 0; i < (int)noreorder.length(); i++)
+      for (unsigned i = 0; i < noreorder.length (); i++)
 	fprintf (symtab->dump_file, "Balanced map symbol no_reorder:%s:%u\n",
 		 noreorder[i]->name (), noreorder[i]->tp_first_run);
     }
@@ -583,7 +581,7 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 
   auto_vec<symtab_node *> next_nodes;
 
-  for (i = 0; i < n_nodes; i++)
+  for (unsigned i = 0; i < order.length (); i++)
     {
       if (symbol_partitioned_p (order[i]))
 	continue;
@@ -798,9 +796,9 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 		     "Partition insns: %i (want %" PRId64 ")\n",
 		     partition->insns, partition_size);
  	  /* When we are finished, avoid creating empty partition.  */
-	  while (i < n_nodes - 1 && symbol_partitioned_p (order[i + 1]))
+	  while (i < order.length () - 1 && symbol_partitioned_p (order[i + 1]))
 	    i++;
-	  if (i == n_nodes - 1)
+	  if (i == order.length () - 1)
 	    break;
 	  total_size -= partition->insns;
 	  partition = new_partition ("");
@@ -848,8 +846,6 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
   gcc_assert (next_nodes.length () || npartitions != 1 || !best_cost || best_cost == -1);
   add_sorted_nodes (next_nodes, partition);
 
-  free (order);
-
   if (symtab->dump_file)
     {
       fprintf (symtab->dump_file, "\nPartition sizes:\n");
@@ -860,7 +856,7 @@  lto_balanced_map (int n_lto_partitions, int max_partition_size)
 	  ltrans_partition p = ltrans_partitions[i];
 	  fprintf (symtab->dump_file, "partition %d contains %d (%2.2f%%)"
 		   " symbols and %d (%2.2f%%) insns\n", i, p->symbols,
-		   100.0 * p->symbols / n_nodes, p->insns,
+		   100.0 * p->symbols / order.length (), p->insns,
 		   100.0 * p->insns / original_total_size);
 	}
 
diff --git a/gcc/passes.c b/gcc/passes.c
index ad0a912e134..ee9c09e9a79 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1673,22 +1673,16 @@  do_per_function (void (*callback) (function *, void *data), void *data)
 static int nnodes;
 static GTY ((length ("nnodes"))) cgraph_node **order;
 
+#define uid_hash_t hash_set<int_hash <int, 0, -1>>
+
 /* Hook called when NODE is removed and therefore should be
-   excluded from order vector.  DATA is an array of integers.
-   DATA[0] holds max index it may be accessed by.  For cgraph
-   node DATA[node->uid + 1] holds index of this node in order
-   vector.  */
+   excluded from order vector.  DATA is a hash set with removed nodes.  */
+
 static void
 remove_cgraph_node_from_order (cgraph_node *node, void *data)
 {
-  int *order_idx = (int *)data;
-
-  if (node->uid >= order_idx[0])
-    return;
-
-  int idx = order_idx[node->uid + 1];
-  if (idx >= 0 && idx < nnodes && order[idx] == node)
-    order[idx] = NULL;
+  uid_hash_t *removed_nodes = (uid_hash_t *)data;
+  removed_nodes->add (node->uid);
 }
 
 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
@@ -1705,30 +1699,23 @@  do_per_function_toporder (void (*callback) (function *, void *data), void *data)
   else
     {
       cgraph_node_hook_list *hook;
-      int *order_idx;
+      uid_hash_t removed_nodes;
       gcc_assert (!order);
       order = ggc_vec_alloc<cgraph_node *> (symtab->cgraph_count);
 
-      order_idx = XALLOCAVEC (int, symtab->cgraph_max_uid + 1);
-      memset (order_idx + 1, -1, sizeof (int) * symtab->cgraph_max_uid);
-      order_idx[0] = symtab->cgraph_max_uid;
-
       nnodes = ipa_reverse_postorder (order);
       for (i = nnodes - 1; i >= 0; i--)
-	{
-	  order[i]->process = 1;
-	  order_idx[order[i]->uid + 1] = i;
-	}
+	order[i]->process = 1;
       hook = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order,
-					      order_idx);
+					      &removed_nodes);
       for (i = nnodes - 1; i >= 0; i--)
 	{
+	  cgraph_node *node = order[i];
+
 	  /* Function could be inlined and removed as unreachable.  */
-	  if (!order[i])
+	  if (node == NULL || removed_nodes.contains (node->uid))
 	    continue;
 
-	  struct cgraph_node *node = order[i];
-
 	  /* Allow possibly removed nodes to be garbage collected.  */
 	  order[i] = NULL;
 	  node->process = 0;
diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h
index 8227abbf210..dda3ae5718f 100644
--- a/gcc/symbol-summary.h
+++ b/gcc/symbol-summary.h
@@ -90,13 +90,13 @@  public:
      does not exist it will be created.  */
   T* get_create (cgraph_node *node)
   {
-    return get (node->summary_uid, true);
+    return get (node->uid, true);
   }
 
   /* Getter for summary callgraph node pointer.  */
   T* get (cgraph_node *node)
   {
-    return get (node->summary_uid, false);
+    return get (node->uid, false);
   }
 
   /* Return number of elements handled by data structure.  */
@@ -108,7 +108,7 @@  public:
   /* Return true if a summary for the given NODE already exists.  */
   bool exists (cgraph_node *node)
   {
-    return m_map.get (node->summary_uid) != NULL;
+    return m_map.get (node->uid) != NULL;
   }
 
   /* Enable insertion hook invocation.  */
@@ -216,7 +216,7 @@  template <typename T>
 void
 function_summary<T *>::symtab_insertion (cgraph_node *node, void *data)
 {
-  gcc_checking_assert (node->summary_uid);
+  gcc_checking_assert (node->uid);
   function_summary *summary = (function_summary <T *> *) (data);
 
   if (summary->m_insertion_enabled)
@@ -227,11 +227,11 @@  template <typename T>
 void
 function_summary<T *>::symtab_removal (cgraph_node *node, void *data)
 {
-  gcc_checking_assert (node->summary_uid);
+  gcc_checking_assert (node->uid);
   function_summary *summary = (function_summary <T *> *) (data);
 
-  int summary_uid = node->summary_uid;
-  T **v = summary->m_map.get (summary_uid);
+  int uid = node->uid;
+  T **v = summary->m_map.get (uid);
 
   if (v)
     {
@@ -240,7 +240,7 @@  function_summary<T *>::symtab_removal (cgraph_node *node, void *data)
       if (!summary->m_ggc)
 	delete (*v);
 
-      summary->m_map.remove (summary_uid);
+      summary->m_map.remove (uid);
     }
 }
 
@@ -256,7 +256,7 @@  function_summary<T *>::symtab_duplication (cgraph_node *node,
     {
       /* This load is necessary, because we insert a new value!  */
       T *duplicate = summary->allocate_new ();
-      summary->m_map.put (node2->summary_uid, duplicate);
+      summary->m_map.put (node2->uid, duplicate);
       summary->duplicate (node, node2, v, duplicate);
     }
 }