Commit e9287a41 by Richard Biener Committed by Richard Biener

re PR middle-end/58723 (ICE in lto_output_edge, at lto-cgraph.c:300 for OpenMP's simd reduction)

2013-11-27  Richard Biener  <rguenther@suse.de>

	PR middle-end/58723
	* cgraphbuild.c (build_cgraph_edges): Do not build edges
	for internal calls.
	(rebuild_cgraph_edges): Likewise.
	* ipa-inline-analysis.c (estimate_function_body_sizes):
	Skip internal calls.
	* tree-inline.c (estimate_num_insns): Estimate size of internal
	calls as 0.
	(gimple_expand_calls_inline): Do not try inline-expanding
	internal calls.
	* lto-streamer-in.c (input_cfg): Stream loop safelen,
	force_vect and simduid.
	(input_struct_function_base): Stream has_force_vect_loops
	and has_simduid_loops.
	(input_function): Adjust.
	* lto-streamer-out.c (output_cfg): Stream loop safelen,
	force_vect and simduid.
	(output_struct_function_base): Stream has_force_vect_loops
	and has_simduid_loops.

From-SVN: r205447
parent 3745a526
2013-11-27 Richard Biener <rguenther@suse.de>
PR middle-end/58723
* cgraphbuild.c (build_cgraph_edges): Do not build edges
for internal calls.
(rebuild_cgraph_edges): Likewise.
* ipa-inline-analysis.c (estimate_function_body_sizes):
Skip internal calls.
* tree-inline.c (estimate_num_insns): Estimate size of internal
calls as 0.
(gimple_expand_calls_inline): Do not try inline-expanding
internal calls.
* lto-streamer-in.c (input_cfg): Stream loop safelen,
force_vect and simduid.
(input_struct_function_base): Stream has_force_vect_loops
and has_simduid_loops.
(input_function): Adjust.
* lto-streamer-out.c (output_cfg): Stream loop safelen,
force_vect and simduid.
(output_struct_function_base): Stream has_force_vect_loops
and has_simduid_loops.
2013-11-27 Kai Tietz <ktietz@redhat.com> 2013-11-27 Kai Tietz <ktietz@redhat.com>
* config/i386/winnt.c (i386_pe_section_type_flags): Use const * config/i386/winnt.c (i386_pe_section_type_flags): Use const
...@@ -335,6 +335,8 @@ build_cgraph_edges (void) ...@@ -335,6 +335,8 @@ build_cgraph_edges (void)
if (decl) if (decl)
cgraph_create_edge (node, cgraph_get_create_node (decl), cgraph_create_edge (node, cgraph_get_create_node (decl),
stmt, bb->count, freq); stmt, bb->count, freq);
else if (gimple_call_internal_p (stmt))
;
else else
cgraph_create_indirect_edge (node, stmt, cgraph_create_indirect_edge (node, stmt,
gimple_call_flags (stmt), gimple_call_flags (stmt),
...@@ -464,6 +466,8 @@ rebuild_cgraph_edges (void) ...@@ -464,6 +466,8 @@ rebuild_cgraph_edges (void)
if (decl) if (decl)
cgraph_create_edge (node, cgraph_get_create_node (decl), stmt, cgraph_create_edge (node, cgraph_get_create_node (decl), stmt,
bb->count, freq); bb->count, freq);
else if (gimple_call_internal_p (stmt))
;
else else
cgraph_create_indirect_edge (node, stmt, cgraph_create_indirect_edge (node, stmt,
gimple_call_flags (stmt), gimple_call_flags (stmt),
......
...@@ -2502,7 +2502,8 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) ...@@ -2502,7 +2502,8 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
} }
if (is_gimple_call (stmt)) if (is_gimple_call (stmt)
&& !gimple_call_internal_p (stmt))
{ {
struct cgraph_edge *edge = cgraph_edge (node, stmt); struct cgraph_edge *edge = cgraph_edge (node, stmt);
struct inline_edge_summary *es = inline_edge_summary (edge); struct inline_edge_summary *es = inline_edge_summary (edge);
......
...@@ -598,7 +598,8 @@ make_new_block (struct function *fn, unsigned int index) ...@@ -598,7 +598,8 @@ make_new_block (struct function *fn, unsigned int index)
/* Read the CFG for function FN from input block IB. */ /* Read the CFG for function FN from input block IB. */
static void static void
input_cfg (struct lto_input_block *ib, struct function *fn, input_cfg (struct lto_input_block *ib, struct data_in *data_in,
struct function *fn,
int count_materialization_scale) int count_materialization_scale)
{ {
unsigned int bb_count; unsigned int bb_count;
...@@ -714,6 +715,11 @@ input_cfg (struct lto_input_block *ib, struct function *fn, ...@@ -714,6 +715,11 @@ input_cfg (struct lto_input_block *ib, struct function *fn,
loop->nb_iterations_estimate.high = streamer_read_hwi (ib); loop->nb_iterations_estimate.high = streamer_read_hwi (ib);
} }
/* Read OMP SIMD related info. */
loop->safelen = streamer_read_hwi (ib);
loop->force_vect = streamer_read_hwi (ib);
loop->simduid = stream_read_tree (ib, data_in);
place_new_loop (fn, loop); place_new_loop (fn, loop);
/* flow_loops_find doesn't like loops not in the tree, hook them /* flow_loops_find doesn't like loops not in the tree, hook them
...@@ -877,6 +883,8 @@ input_struct_function_base (struct function *fn, struct data_in *data_in, ...@@ -877,6 +883,8 @@ input_struct_function_base (struct function *fn, struct data_in *data_in,
fn->has_nonlocal_label = bp_unpack_value (&bp, 1); fn->has_nonlocal_label = bp_unpack_value (&bp, 1);
fn->calls_alloca = bp_unpack_value (&bp, 1); fn->calls_alloca = bp_unpack_value (&bp, 1);
fn->calls_setjmp = bp_unpack_value (&bp, 1); fn->calls_setjmp = bp_unpack_value (&bp, 1);
fn->has_force_vect_loops = bp_unpack_value (&bp, 1);
fn->has_simduid_loops = bp_unpack_value (&bp, 1);
fn->va_list_fpr_size = bp_unpack_value (&bp, 8); fn->va_list_fpr_size = bp_unpack_value (&bp, 8);
fn->va_list_gpr_size = bp_unpack_value (&bp, 8); fn->va_list_gpr_size = bp_unpack_value (&bp, 8);
...@@ -923,7 +931,7 @@ input_function (tree fn_decl, struct data_in *data_in, ...@@ -923,7 +931,7 @@ input_function (tree fn_decl, struct data_in *data_in,
if (!node) if (!node)
node = cgraph_create_node (fn_decl); node = cgraph_create_node (fn_decl);
input_struct_function_base (fn, data_in, ib); input_struct_function_base (fn, data_in, ib);
input_cfg (ib_cfg, fn, node->count_materialization_scale); input_cfg (ib_cfg, data_in, fn, node->count_materialization_scale);
/* Read all the SSA names. */ /* Read all the SSA names. */
input_ssa_names (ib, data_in, fn); input_ssa_names (ib, data_in, fn);
......
...@@ -1642,6 +1642,11 @@ output_cfg (struct output_block *ob, struct function *fn) ...@@ -1642,6 +1642,11 @@ output_cfg (struct output_block *ob, struct function *fn)
streamer_write_uhwi (ob, loop->nb_iterations_estimate.low); streamer_write_uhwi (ob, loop->nb_iterations_estimate.low);
streamer_write_hwi (ob, loop->nb_iterations_estimate.high); streamer_write_hwi (ob, loop->nb_iterations_estimate.high);
} }
/* Write OMP SIMD related info. */
streamer_write_hwi (ob, loop->safelen);
streamer_write_hwi (ob, loop->force_vect);
stream_write_tree (ob, loop->simduid, true);
} }
ob->main_stream = tmp_stream; ob->main_stream = tmp_stream;
...@@ -1735,6 +1740,8 @@ output_struct_function_base (struct output_block *ob, struct function *fn) ...@@ -1735,6 +1740,8 @@ output_struct_function_base (struct output_block *ob, struct function *fn)
bp_pack_value (&bp, fn->has_nonlocal_label, 1); bp_pack_value (&bp, fn->has_nonlocal_label, 1);
bp_pack_value (&bp, fn->calls_alloca, 1); bp_pack_value (&bp, fn->calls_alloca, 1);
bp_pack_value (&bp, fn->calls_setjmp, 1); bp_pack_value (&bp, fn->calls_setjmp, 1);
bp_pack_value (&bp, fn->has_force_vect_loops, 1);
bp_pack_value (&bp, fn->has_simduid_loops, 1);
bp_pack_value (&bp, fn->va_list_fpr_size, 8); bp_pack_value (&bp, fn->va_list_fpr_size, 8);
bp_pack_value (&bp, fn->va_list_gpr_size, 8); bp_pack_value (&bp, fn->va_list_gpr_size, 8);
......
...@@ -3797,12 +3797,16 @@ estimate_num_insns (gimple stmt, eni_weights *weights) ...@@ -3797,12 +3797,16 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
case GIMPLE_CALL: case GIMPLE_CALL:
{ {
tree decl = gimple_call_fndecl (stmt); tree decl;
struct cgraph_node *node = NULL; struct cgraph_node *node = NULL;
/* Do not special case builtins where we see the body. /* Do not special case builtins where we see the body.
This just confuse inliner. */ This just confuse inliner. */
if (!decl || !(node = cgraph_get_node (decl)) || node->definition) if (gimple_call_internal_p (stmt))
return 0;
else if (!(decl = gimple_call_fndecl (stmt))
|| !(node = cgraph_get_node (decl))
|| node->definition)
; ;
/* For buitins that are likely expanded to nothing or /* For buitins that are likely expanded to nothing or
inlined do not account operand costs. */ inlined do not account operand costs. */
...@@ -4423,6 +4427,7 @@ gimple_expand_calls_inline (basic_block bb, copy_body_data *id) ...@@ -4423,6 +4427,7 @@ gimple_expand_calls_inline (basic_block bb, copy_body_data *id)
gimple stmt = gsi_stmt (gsi); gimple stmt = gsi_stmt (gsi);
if (is_gimple_call (stmt) if (is_gimple_call (stmt)
&& !gimple_call_internal_p (stmt)
&& expand_call_inline (bb, stmt, id)) && expand_call_inline (bb, stmt, id))
return true; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment