Commit 73fb742d by Richard Biener Committed by Richard Biener

re PR ipa/67783 (quadratic time consumption in IPA inlining with -O1 and higher)

2015-10-12  Richard Biener  <rguenther@suse.de>

	PR ipa/67783
	* ipa-inline-analysis.c (estimate_function_body_sizes): Re-add
	code that analyzes IVs on each stmt but in a cheaper way avoiding
	quadratic behavior.

From-SVN: r228710
parent aad11912
2015-10-12 Richard Biener <rguenther@suse.de>
PR ipa/67783
* ipa-inline-analysis.c (estimate_function_body_sizes): Re-add
code that analyzes IVs on each stmt but in a cheaper way avoiding
quadratic behavior.
2015-10-12 Nick Clifton <nickc@redhat.com> 2015-10-12 Nick Clifton <nickc@redhat.com>
* config/msp430/msp430.c (msp430_mcu_names): Rename to * config/msp430/msp430.c (msp430_mcu_names): Rename to
...@@ -2786,37 +2786,60 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) ...@@ -2786,37 +2786,60 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
&will_be_nonconstant); &will_be_nonconstant);
} }
exits.release (); exits.release ();
}
for (gphi_iterator gsi = gsi_start_phis (loop->header); /* To avoid quadratic behavior we analyze stride predicates only
!gsi_end_p (gsi); gsi_next (&gsi)) 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++)
{ {
gphi *phi = gsi.phi (); gimple_stmt_iterator gsi;
tree use = gimple_phi_result (phi); bb_predicate = *(struct predicate *) body[i]->aux;
affine_iv iv; for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi);
predicate will_be_nonconstant; gsi_next (&gsi))
if (virtual_operand_p (use) {
|| !simple_iv (loop, loop, use, &iv, true) gimple *stmt = gsi_stmt (gsi);
|| is_gimple_min_invariant (iv.step))
continue; if (!is_gimple_assign (stmt))
will_be_nonconstant continue;
= will_be_nonconstant_expr_predicate (fbi.info, info,
iv.step, tree def = gimple_assign_lhs (stmt);
nonconstant_names); if (TREE_CODE (def) != SSA_NAME)
if (!true_predicate_p (&will_be_nonconstant)) continue;
will_be_nonconstant = and_predicates (info->conds,
&bb_predicate, affine_iv iv;
&will_be_nonconstant); if (!simple_iv (loop_containing_stmt (stmt),
if (!true_predicate_p (&will_be_nonconstant) loop_containing_stmt (stmt),
&& !false_predicate_p (&will_be_nonconstant)) def, &iv, true)
/* This is slightly inprecise. We may want to represent || is_gimple_min_invariant (iv.step))
each loop with independent predicate. */ continue;
loop_stride = and_predicates (info->conds, &loop_stride,
&will_be_nonconstant); 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
= 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, set_hint_predicate (&inline_summaries->get (node)->loop_iterations,
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 (); scev_finalize ();
} }
FOR_ALL_BB_FN (bb, my_function) FOR_ALL_BB_FN (bb, my_function)
......
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