[Bug tree-optimization/60382] [4.8/4.9 Regression] ICE on valid code at -O3 on x86_64-linux-gnu (in vect_create_epilog_for_reduction, at tree-vect-loop.c:4352)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60382 --- Comment #4 from Richard Biener rguenth at gcc dot gnu.org --- Author: rguenth Date: Tue Mar 4 08:47:55 2014 New Revision: 208305 URL: http://gcc.gnu.org/viewcvs?rev=208305root=gccview=rev Log: 2014-03-04 Richard Biener rguent...@suse.de PR tree-optimization/60382 * tree-vect-loop.c (vect_is_simple_reduction_1): Do not consider dead PHIs a reduction. * gcc.dg/vect/pr60382.c: New testcase. Added: trunk/gcc/testsuite/gcc.dg/vect/pr60382.c Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-vect-loop.c
[Bug tree-optimization/60382] [4.8/4.9 Regression] ICE on valid code at -O3 on x86_64-linux-gnu (in vect_create_epilog_for_reduction, at tree-vect-loop.c:4352)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60382 Richard Biener rguenth at gcc dot gnu.org changed: What|Removed |Added Priority|P3 |P1 Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #2 from Richard Biener rguenth at gcc dot gnu.org --- Mine.
[Bug tree-optimization/60382] [4.8/4.9 Regression] ICE on valid code at -O3 on x86_64-linux-gnu (in vect_create_epilog_for_reduction, at tree-vect-loop.c:4352)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60382 --- Comment #3 from Richard Biener rguenth at gcc dot gnu.org --- The issue is that in vectorizable_reduction we compute double_reduc in a wrong way: if (nested_cycle) { def_bb = gimple_bb (reduc_def_stmt); def_stmt_loop = def_bb-loop_father; def_arg = PHI_ARG_DEF_FROM_EDGE (reduc_def_stmt, loop_preheader_edge (def_stmt_loop)); if (TREE_CODE (def_arg) == SSA_NAME (def_arg_stmt = SSA_NAME_DEF_STMT (def_arg)) gimple_code (def_arg_stmt) == GIMPLE_PHI flow_bb_inside_loop_p (outer_loop, gimple_bb (def_arg_stmt)) vinfo_for_stmt (def_arg_stmt) STMT_VINFO_DEF_TYPE (vinfo_for_stmt (def_arg_stmt)) == vect_double_reduction_def) double_reduc = true; } that is because def_arg is a constant (and the outer loop reduction PHI is dead). Easiest is to not detect this as a valid reduction with sth like Index: gcc/tree-vect-loop.c === --- gcc/tree-vect-loop.c(revision 208269) +++ gcc/tree-vect-loop.c(working copy) @@ -2193,6 +2193,12 @@ vect_is_simple_reduction_1 (loop_vec_inf || (!check_reduction flow_loop_nested_p (vect_loop, loop))); name = PHI_RESULT (phi); + /* ??? If there are no uses of the PHI result the inner loop reduction + won't be detected as possibly double-reduction by vectorizable_reduction + because that tries to walk the PHI arg from the preheader edge which + can be constant. See PR60382. */ + if (has_zero_uses (name)) +return NULL; nloop_uses = 0; FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name) {
[Bug tree-optimization/60382] [4.8/4.9 Regression] ICE on valid code at -O3 on x86_64-linux-gnu (in vect_create_epilog_for_reduction, at tree-vect-loop.c:4352)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60382 Jakub Jelinek jakub at gcc dot gnu.org changed: What|Removed |Added Status|UNCONFIRMED |NEW Last reconfirmed||2014-03-02 CC||jakub at gcc dot gnu.org Version|unknown |4.8.3 Target Milestone|--- |4.8.3 Summary|ICE on valid code at -O3 on |[4.8/4.9 Regression] ICE on |x86_64-linux-gnu (in|valid code at -O3 on |vect_create_epilog_for_redu |x86_64-linux-gnu (in |ction, at |vect_create_epilog_for_redu |tree-vect-loop.c:4352) |ction, at ||tree-vect-loop.c:4352) Ever confirmed|0 |1 --- Comment #1 from Jakub Jelinek jakub at gcc dot gnu.org --- Started with r206460.