https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67783
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- I believe we should greatly simplify this heuristic to only consider loop header PHI defs as IVs where we derive predicates for the stride for: Index: gcc/ipa-inline-analysis.c =================================================================== --- gcc/ipa-inline-analysis.c (revision 228320) +++ gcc/ipa-inline-analysis.c (working copy) @@ -2762,7 +2762,6 @@ estimate_function_body_sizes (struct cgr edge ex; unsigned int j, i; 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); @@ -2788,46 +2787,32 @@ estimate_function_body_sizes (struct cgr } exits.release (); - for (i = 0; i < loop->num_nodes; i++) + for (gphi_iterator gsi = gsi_start_phis (loop->header); + !gsi_end_p (gsi); gsi_next (&gsi)) { - gimple_stmt_iterator gsi; - bb_predicate = *(struct predicate *) body[i]->aux; - for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi); - 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 (!simple_iv - (loop, loop_containing_stmt (stmt), use, &iv, true) - || is_gimple_min_invariant (iv.step)) - continue; - 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); - } - } + gphi *phi = gsi.phi (); + tree use = gimple_phi_result (phi); + affine_iv iv; + predicate will_be_nonconstant; + if (!virtual_operand_p (use) + || !simple_iv (loop, loop, use, &iv, true) + || is_gimple_min_invariant (iv.step)) + continue; + 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, loop_iterations);