From 43570a062df7edd02a8936d99ca7790eb20fd84f Mon Sep 17 00:00:00 2001 From: mliska Date: Tue, 26 May 2015 15:04:20 +0200 Subject: [PATCH] LTO balanced map: add stats about insns and symbols. gcc/lto/ChangeLog: 2015-05-26 Martin Liska * lto-partition.c (new_partition): Reset number of symbols. (add_symbol_to_partition_1): Increment number of symbols. (undo_partition): Decrement number of symbols. (lto_balanced_map): Dump number of symbols and insns that belong to a partition. * lto-partition.h (struct ltrans_partition_def): Add symbol counter. --- gcc/lto/lto-partition.c | 25 ++++++++++++++++++++++++- gcc/lto/lto-partition.h | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 235b735..8c72d9e 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -73,6 +73,7 @@ new_partition (const char *name) part->encoder = lto_symtab_encoder_new (false); part->name = name; part->insns = 0; + part->symbols = 0; ltrans_partitions.safe_push (part); return part; } @@ -157,6 +158,8 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node *node) gcc_assert (c != SYMBOL_EXTERNAL && (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node))); + part->symbols++; + lto_set_symtab_encoder_in_partition (part->encoder, node); if (symbol_partitioned_p (node)) @@ -274,6 +277,7 @@ undo_partition (ltrans_partition partition, unsigned int n_nodes) { symtab_node *node = lto_symtab_encoder_deref (partition->encoder, n_nodes); + partition->symbols--; cgraph_node *cnode; /* After UNDO we no longer know what was visited. */ @@ -462,7 +466,7 @@ lto_balanced_map (int n_lto_partitions) auto_vec varpool_order; int i; struct cgraph_node *node; - int total_size = 0, best_total_size = 0; + int original_total_size, total_size = 0, best_total_size = 0; int partition_size; ltrans_partition partition; int last_visited_node = 0; @@ -488,6 +492,8 @@ lto_balanced_map (int n_lto_partitions) total_size += inline_summaries->get (node)->size; } + original_total_size = total_size; + /* Streaming works best when the source units do not cross partition boundaries much. This is because importing function from a source unit tends to import a lot of global trees defined there. We should @@ -782,6 +788,23 @@ lto_balanced_map (int n_lto_partitions) add_sorted_nodes (next_nodes, partition); free (order); + + if (symtab->dump_file) + { + fprintf (symtab->dump_file, "\nPartition sizes:\n"); + unsigned partitions = ltrans_partitions.length (); + + for (unsigned i = 0; i < partitions ; i++) + { + 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->insns / original_total_size); + } + + fprintf (symtab->dump_file, "\n"); + } } /* Return true if we must not change the name of the NODE. The name as diff --git a/gcc/lto/lto-partition.h b/gcc/lto/lto-partition.h index 10065f9..a44e8e7 100644 --- a/gcc/lto/lto-partition.h +++ b/gcc/lto/lto-partition.h @@ -26,6 +26,7 @@ struct ltrans_partition_def lto_symtab_encoder_t encoder; const char * name; int insns; + int symbols; hash_set *initializers_visited; }; -- 2.1.4