[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)

2014-03-04 Thread rguenth at gcc dot gnu.org
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)

2014-03-03 Thread rguenth at gcc dot gnu.org
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)

2014-03-03 Thread rguenth at gcc dot gnu.org
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)

2014-03-02 Thread jakub at gcc dot gnu.org
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.