re PR lto/47162 (LTO is broken)

Fix PR lto/47162.

2011-01-05  Martin Jambor  <mjambor@suse.cz>

	PR lto/47162
	* lto-cgraph.c (output_cgraph_opt_summary_p): Also check for thunk
	deltas on streamed outgoing edges.
	(output_node_opt_summary): Output info for outgoing edges only when
	the node is in new parameter set.
	(output_cgraph_opt_summary): New parameter set, passed to the two
	aforementioned functions.  Update its forward declaration and its
	callee too.

From-SVN: r168515
This commit is contained in:
Martin Jambor 2011-01-05 15:55:27 +01:00 committed by H.J. Lu
parent 7bd1115736
commit 644e637fca
2 changed files with 47 additions and 17 deletions

View File

@ -1,3 +1,14 @@
2011-01-05 Martin Jambor <mjambor@suse.cz>
PR lto/47162
* lto-cgraph.c (output_cgraph_opt_summary_p): Also check for thunk
deltas on streamed outgoing edges.
(output_node_opt_summary): Output info for outgoing edges only when
the node is in new parameter set.
(output_cgraph_opt_summary): New parameter set, passed to the two
aforementioned functions. Update its forward declaration and its
callee too.
2011-01-05 Tom Tromey <tromey@redhat.com> 2011-01-05 Tom Tromey <tromey@redhat.com>
* c-parser.c (c_parser_omp_atomic): Pass location of assignment * c-parser.c (c_parser_omp_atomic): Pass location of assignment

View File

@ -46,7 +46,7 @@ along with GCC; see the file COPYING3. If not see
#include "gcov-io.h" #include "gcov-io.h"
static void output_varpool (cgraph_node_set, varpool_node_set); static void output_varpool (cgraph_node_set, varpool_node_set);
static void output_cgraph_opt_summary (void); static void output_cgraph_opt_summary (cgraph_node_set set);
static void input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes); static void input_cgraph_opt_summary (VEC (cgraph_node_ptr, heap) * nodes);
@ -861,7 +861,7 @@ output_cgraph (cgraph_node_set set, varpool_node_set vset)
static bool asm_nodes_output = false; static bool asm_nodes_output = false;
if (flag_wpa) if (flag_wpa)
output_cgraph_opt_summary (); output_cgraph_opt_summary (set);
ob = lto_create_simple_output_block (LTO_section_cgraph); ob = lto_create_simple_output_block (LTO_section_cgraph);
@ -1596,13 +1596,26 @@ input_cgraph (void)
/* True when we need optimization summary for NODE. */ /* True when we need optimization summary for NODE. */
static int static int
output_cgraph_opt_summary_p (struct cgraph_node *node) output_cgraph_opt_summary_p (struct cgraph_node *node, cgraph_node_set set)
{ {
if (!node->clone_of) struct cgraph_edge *e;
return false;
return (node->clone.tree_map if (cgraph_node_in_set_p (node, set))
{
for (e = node->callees; e; e = e->next_callee)
if (e->indirect_info
&& e->indirect_info->thunk_delta != 0)
return true;
for (e = node->indirect_calls; e; e = e->next_callee)
if (e->indirect_info->thunk_delta != 0)
return true;
}
return (node->clone_of
&& (node->clone.tree_map
|| node->clone.args_to_skip || node->clone.args_to_skip
|| node->clone.combined_args_to_skip); || node->clone.combined_args_to_skip));
} }
/* Output optimization summary for EDGE to OB. */ /* Output optimization summary for EDGE to OB. */
@ -1621,7 +1634,8 @@ output_edge_opt_summary (struct output_block *ob,
static void static void
output_node_opt_summary (struct output_block *ob, output_node_opt_summary (struct output_block *ob,
struct cgraph_node *node) struct cgraph_node *node,
cgraph_node_set set)
{ {
unsigned int index; unsigned int index;
bitmap_iterator bi; bitmap_iterator bi;
@ -1659,17 +1673,21 @@ output_node_opt_summary (struct output_block *ob,
bp_pack_value (&bp, map->ref_p, 1); bp_pack_value (&bp, map->ref_p, 1);
lto_output_bitpack (&bp); lto_output_bitpack (&bp);
} }
if (cgraph_node_in_set_p (node, set))
{
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
output_edge_opt_summary (ob, e); output_edge_opt_summary (ob, e);
for (e = node->indirect_calls; e; e = e->next_callee) for (e = node->indirect_calls; e; e = e->next_callee)
output_edge_opt_summary (ob, e); output_edge_opt_summary (ob, e);
}
} }
/* Output optimization summaries stored in callgraph. /* Output optimization summaries stored in callgraph.
At the moment it is the clone info structure. */ At the moment it is the clone info structure. */
static void static void
output_cgraph_opt_summary (void) output_cgraph_opt_summary (cgraph_node_set set)
{ {
struct cgraph_node *node; struct cgraph_node *node;
int i, n_nodes; int i, n_nodes;
@ -1681,16 +1699,17 @@ output_cgraph_opt_summary (void)
encoder = ob->decl_state->cgraph_node_encoder; encoder = ob->decl_state->cgraph_node_encoder;
n_nodes = lto_cgraph_encoder_size (encoder); n_nodes = lto_cgraph_encoder_size (encoder);
for (i = 0; i < n_nodes; i++) for (i = 0; i < n_nodes; i++)
if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder, i))) if (output_cgraph_opt_summary_p (lto_cgraph_encoder_deref (encoder, i),
set))
count++; count++;
lto_output_uleb128_stream (ob->main_stream, count); lto_output_uleb128_stream (ob->main_stream, count);
for (i = 0; i < n_nodes; i++) for (i = 0; i < n_nodes; i++)
{ {
node = lto_cgraph_encoder_deref (encoder, i); node = lto_cgraph_encoder_deref (encoder, i);
if (output_cgraph_opt_summary_p (node)) if (output_cgraph_opt_summary_p (node, set))
{ {
lto_output_uleb128_stream (ob->main_stream, i); lto_output_uleb128_stream (ob->main_stream, i);
output_node_opt_summary (ob, node); output_node_opt_summary (ob, node, set);
} }
} }
produce_asm (ob, NULL); produce_asm (ob, NULL);