diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-14 18:55:01 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-14 18:55:01 +0000 |
commit | bde1393a7b0583bc123ac962ed2f729b80cd7498 (patch) | |
tree | d9e8972ddece739bbdc248c5e33919ded2862cf7 /gcc/ipa-inline-analysis.c | |
parent | 8f8a206e72c6183084a6792ae98593944dd06fbd (diff) | |
download | gcc-bde1393a7b0583bc123ac962ed2f729b80cd7498.tar.gz |
2016-04-14 Basile Starynkevitch <basile@starynkevitch.net>
{{merging with even more of GCC 6, using subversion 1.9
svn merge -r228401:229500 ^/trunk
}}
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@234985 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-inline-analysis.c')
-rw-r--r-- | gcc/ipa-inline-analysis.c | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 108ff3e689f..e93d445ccc6 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -2760,9 +2760,8 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) { vec<edge> exits; edge ex; - unsigned int j, i; + unsigned int j; struct tree_niter_desc niter_desc; - basic_block *body = get_loop_body (loop); bb_predicate = *(struct predicate *) loop->header->aux; exits = get_loop_exit_edges (loop); @@ -2787,8 +2786,16 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) &will_be_nonconstant); } exits.release (); + } - for (i = 0; i < loop->num_nodes; i++) + /* To avoid quadratic behavior we analyze stride predicates only + with respect to the containing loop. Thus we simply iterate + over all defs in the outermost loop body. */ + for (loop = loops_for_fn (cfun)->tree_root->inner; + loop != NULL; loop = loop->next) + { + basic_block *body = get_loop_body (loop); + for (unsigned i = 0; i < loop->num_nodes; i++) { gimple_stmt_iterator gsi; bb_predicate = *(struct predicate *) body[i]->aux; @@ -2796,42 +2803,43 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) gsi_next (&gsi)) { gimple *stmt = gsi_stmt (gsi); - affine_iv iv; - ssa_op_iter iter; - tree use; - FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) - { - predicate will_be_nonconstant; + if (!is_gimple_assign (stmt)) + continue; + + tree def = gimple_assign_lhs (stmt); + if (TREE_CODE (def) != SSA_NAME) + continue; - if (!simple_iv - (loop, loop_containing_stmt (stmt), use, &iv, true) - || is_gimple_min_invariant (iv.step)) - continue; + affine_iv iv; + if (!simple_iv (loop_containing_stmt (stmt), + loop_containing_stmt (stmt), + def, &iv, true) + || is_gimple_min_invariant (iv.step)) + continue; + + predicate will_be_nonconstant + = will_be_nonconstant_expr_predicate (fbi.info, info, + iv.step, + nonconstant_names); + if (!true_predicate_p (&will_be_nonconstant)) will_be_nonconstant - = will_be_nonconstant_expr_predicate (fbi.info, info, - iv.step, - nonconstant_names); - if (!true_predicate_p (&will_be_nonconstant)) - will_be_nonconstant - = and_predicates (info->conds, - &bb_predicate, - &will_be_nonconstant); - if (!true_predicate_p (&will_be_nonconstant) - && !false_predicate_p (&will_be_nonconstant)) - /* This is slightly inprecise. We may want to represent - each loop with independent predicate. */ - loop_stride = - and_predicates (info->conds, &loop_stride, + = and_predicates (info->conds, &bb_predicate, &will_be_nonconstant); - } + if (!true_predicate_p (&will_be_nonconstant) + && !false_predicate_p (&will_be_nonconstant)) + /* This is slightly inprecise. We may want to represent + each loop with independent predicate. */ + loop_stride = and_predicates (info->conds, &loop_stride, + &will_be_nonconstant); } } free (body); } set_hint_predicate (&inline_summaries->get (node)->loop_iterations, loop_iterations); - set_hint_predicate (&inline_summaries->get (node)->loop_stride, loop_stride); + set_hint_predicate (&inline_summaries->get (node)->loop_stride, + loop_stride); scev_finalize (); } FOR_ALL_BB_FN (bb, my_function) @@ -2956,10 +2964,12 @@ compute_inline_parameters (struct cgraph_node *node, bool early) info->size = info->self_size; info->stack_frame_offset = 0; info->estimated_stack_size = info->estimated_self_stack_size; -#ifdef ENABLE_CHECKING - inline_update_overall_summary (node); - gcc_assert (info->time == info->self_time && info->size == info->self_size); -#endif + if (flag_checking) + { + inline_update_overall_summary (node); + gcc_assert (info->time == info->self_time + && info->size == info->self_size); + } pop_cfun (); } @@ -4104,6 +4114,10 @@ inline_generate_summary (void) { struct cgraph_node *node; + FOR_EACH_DEFINED_FUNCTION (node) + if (DECL_STRUCT_FUNCTION (node->decl)) + node->local.versionable = tree_versionable_function_p (node->decl); + /* When not optimizing, do not bother to analyze. Inlining is still done because edge redirection needs to happen there. */ if (!optimize && !flag_generate_lto && !flag_generate_offload && !flag_wpa) |