diff options
author | Richard Guenther <rguenther@suse.de> | 2012-05-21 12:45:59 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-05-21 12:45:59 +0000 |
commit | 21039e0e003246c87d123bcd7099d411ac82a1fd (patch) | |
tree | f9e3d8cc6e12497d2fbf21bdd48492e542cb7cee /gcc/tree-vect-loop.c | |
parent | 9b5effa449611ed3e8360d4e3440c6cc00c70035 (diff) | |
download | gcc-21039e0e003246c87d123bcd7099d411ac82a1fd.zip gcc-21039e0e003246c87d123bcd7099d411ac82a1fd.tar.gz gcc-21039e0e003246c87d123bcd7099d411ac82a1fd.tar.bz2 |
re PR middle-end/53408 (ICE in get_initial_def_for_induction, at tree-vect-loop.c:3222)
2012-05-21 Richard Guenther <rguenther@suse.de>
PR tree-optimization/53408
* tree-vect-loop.c (vectorizable_induction): Properly check
the restriction that we cannot handle induction results from
the inner loop outside of the outer loop.
* gcc.dg/torture/pr53408.c: New testcase.
From-SVN: r187710
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r-- | gcc/tree-vect-loop.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 5fe1165..528788f 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -5061,12 +5061,46 @@ vectorizable_induction (gimple phi, gimple_stmt_iterator *gsi ATTRIBUTE_UNUSED, tree vec_def; gcc_assert (ncopies >= 1); - /* FORNOW. This restriction should be relaxed. */ - if (nested_in_vect_loop_p (loop, phi) && ncopies > 1) + /* FORNOW. These restrictions should be relaxed. */ + if (nested_in_vect_loop_p (loop, phi)) { - if (vect_print_dump_info (REPORT_DETAILS)) - fprintf (vect_dump, "multiple types in nested loop."); - return false; + imm_use_iterator imm_iter; + use_operand_p use_p; + gimple exit_phi; + edge latch_e; + tree loop_arg; + + if (ncopies > 1) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "multiple types in nested loop."); + return false; + } + + exit_phi = NULL; + latch_e = loop_latch_edge (loop->inner); + loop_arg = PHI_ARG_DEF_FROM_EDGE (phi, latch_e); + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, loop_arg) + { + if (!flow_bb_inside_loop_p (loop->inner, + gimple_bb (USE_STMT (use_p)))) + { + exit_phi = USE_STMT (use_p); + break; + } + } + if (exit_phi) + { + stmt_vec_info exit_phi_vinfo = vinfo_for_stmt (exit_phi); + if (!(STMT_VINFO_RELEVANT_P (exit_phi_vinfo) + && !STMT_VINFO_LIVE_P (exit_phi_vinfo))) + { + if (vect_print_dump_info (REPORT_DETAILS)) + fprintf (vect_dump, "inner-loop induction only used outside " + "of the outer vectorized loop."); + return false; + } + } } if (!STMT_VINFO_RELEVANT_P (stmt_info)) |