diff options
author | Richard Biener <rguenther@suse.de> | 2013-11-27 15:18:23 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-11-27 15:18:23 +0000 |
commit | e9287a41dffc9e76dd80be4be75b0c3a58f57231 (patch) | |
tree | a420c4091323d45ede618fbe00f2bb1785f9edf6 /gcc | |
parent | 3745a526d6e978059a3de751e302ecd2af88c0de (diff) | |
download | gcc-e9287a41dffc9e76dd80be4be75b0c3a58f57231.zip gcc-e9287a41dffc9e76dd80be4be75b0c3a58f57231.tar.gz gcc-e9287a41dffc9e76dd80be4be75b0c3a58f57231.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 22 | ||||
-rw-r--r-- | gcc/cgraphbuild.c | 4 | ||||
-rw-r--r-- | gcc/ipa-inline-analysis.c | 3 | ||||
-rw-r--r-- | gcc/lto-streamer-in.c | 12 | ||||
-rw-r--r-- | gcc/lto-streamer-out.c | 7 | ||||
-rw-r--r-- | gcc/tree-inline.c | 9 |
6 files changed, 52 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3476e48..3899f7e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +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> * config/i386/winnt.c (i386_pe_section_type_flags): Use const diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index b6cafff..9a63982 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -335,6 +335,8 @@ build_cgraph_edges (void) if (decl) cgraph_create_edge (node, cgraph_get_create_node (decl), stmt, bb->count, freq); + else if (gimple_call_internal_p (stmt)) + ; else cgraph_create_indirect_edge (node, stmt, gimple_call_flags (stmt), @@ -464,6 +466,8 @@ rebuild_cgraph_edges (void) if (decl) cgraph_create_edge (node, cgraph_get_create_node (decl), stmt, bb->count, freq); + else if (gimple_call_internal_p (stmt)) + ; else cgraph_create_indirect_edge (node, stmt, gimple_call_flags (stmt), diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index a570883..ad6fe8f 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -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 inline_edge_summary *es = inline_edge_summary (edge); diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index 333e815..c5cb23c 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -598,7 +598,8 @@ make_new_block (struct function *fn, unsigned int index) /* Read the CFG for function FN from input block IB. */ 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) { unsigned int bb_count; @@ -714,6 +715,11 @@ input_cfg (struct lto_input_block *ib, struct function *fn, 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); /* 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, fn->has_nonlocal_label = bp_unpack_value (&bp, 1); fn->calls_alloca = 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_gpr_size = bp_unpack_value (&bp, 8); @@ -923,7 +931,7 @@ input_function (tree fn_decl, struct data_in *data_in, if (!node) node = cgraph_create_node (fn_decl); 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. */ input_ssa_names (ib, data_in, fn); diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 6163d12..94dc131 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -1642,6 +1642,11 @@ output_cfg (struct output_block *ob, struct function *fn) streamer_write_uhwi (ob, loop->nb_iterations_estimate.low); 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; @@ -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->calls_alloca, 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_gpr_size, 8); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 0a6e0cd..f42ade02 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3797,12 +3797,16 @@ estimate_num_insns (gimple stmt, eni_weights *weights) case GIMPLE_CALL: { - tree decl = gimple_call_fndecl (stmt); + tree decl; struct cgraph_node *node = NULL; /* Do not special case builtins where we see the body. 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 inlined do not account operand costs. */ @@ -4423,6 +4427,7 @@ gimple_expand_calls_inline (basic_block bb, copy_body_data *id) gimple stmt = gsi_stmt (gsi); if (is_gimple_call (stmt) + && !gimple_call_internal_p (stmt) && expand_call_inline (bb, stmt, id)) return true; } |