]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/69466 (ICE: Invalid PHI argument after vectorization (on...
authorRichard Biener <rguenther@suse.de>
Thu, 28 Jan 2016 09:10:30 +0000 (09:10 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 28 Jan 2016 09:10:30 +0000 (09:10 +0000)
2016-01-28  Richard Biener  <rguenther@suse.de>

PR tree-optimization/69466
* tree-vect-loop-manip.c (slpeel_duplicate_current_defs_from_edges):
Account for PHIs we couldn't duplicate.

* gfortran.dg/vect/pr69466.f90: New testcase.

From-SVN: r232916

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/vect/pr69466.f90 [new file with mode: 0644]
gcc/tree-vect-loop-manip.c

index c1d8fafcdb0c85a1c09678b6de50a98629be4a32..1dc8252f2bda517efd81a94434728113e4057de0 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69466
+       * tree-vect-loop-manip.c (slpeel_duplicate_current_defs_from_edges):
+       Account for PHIs we couldn't duplicate.
+
 2016-01-28  Martin Liska  <mliska@suse.cz>
 
        PR pch/68758
index 540ffedf01189b745128a2d80b0ba48c266c3be0..60c87fe9f9f284f3b56ee470464739731c393ad1 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-28  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69466
+       * gfortran.dg/vect/pr69466.f90: New testcase.
+
 2016-01-28  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * g++.dg/pr67989.C: Remove ARM-specific option.
diff --git a/gcc/testsuite/gfortran.dg/vect/pr69466.f90 b/gcc/testsuite/gfortran.dg/vect/pr69466.f90
new file mode 100644 (file)
index 0000000..a01950f
--- /dev/null
@@ -0,0 +1,42 @@
+! { dg-do compile }
+! { dg-additional-options "-march=core-avx2" { target x86_64-*-* i?86-*-* } }
+
+ subroutine foo
+
+  integer :: a, b, c, d, e
+
+  integer, dimension(:), allocatable :: f, g, h
+
+  call zoo (a)
+  call zoo (b)
+  call zoo (c)
+
+  if(a == b) then
+     allocate(g(0:d-1), h(0:d-1))
+  else
+     allocate(g(1), h(1))
+     if (b /= 0) then
+        call zoo(b)
+     endif
+  endif
+
+  if(a == b) then
+     do d=0,c-1
+     e = e + g(d)
+     if(d == 0) then
+        h(d) = 0
+     else
+        h(d) = h(d-1) + g(d-1)
+     endif
+     end do
+  endif
+
+  if(a == b) then
+     allocate(f(e), g(e))
+  endif
+
+  if(a == 0) then
+     call boo(e)
+  endif
+
+ end subroutine foo
index f9fdf013e1006e6675a9f077cc8d3eecd3d1557a..f8a44b53217b18b367abac7472a17e42a941304b 100644 (file)
@@ -727,17 +727,26 @@ slpeel_duplicate_current_defs_from_edges (edge from, edge to)
 
   for (gsi_from = gsi_start_phis (from->dest),
        gsi_to = gsi_start_phis (to->dest);
-       !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to);
-       gsi_next (&gsi_from), gsi_next (&gsi_to))
+       !gsi_end_p (gsi_from) && !gsi_end_p (gsi_to);)
     {
       gimple *from_phi = gsi_stmt (gsi_from);
       gimple *to_phi = gsi_stmt (gsi_to);
       tree from_arg = PHI_ARG_DEF_FROM_EDGE (from_phi, from);
+      if (TREE_CODE (from_arg) != SSA_NAME)
+       {       
+         gsi_next (&gsi_from);
+         continue;
+       }
       tree to_arg = PHI_ARG_DEF_FROM_EDGE (to_phi, to);
-      if (TREE_CODE (from_arg) == SSA_NAME
-         && TREE_CODE (to_arg) == SSA_NAME
-         && get_current_def (to_arg) == NULL_TREE)
+      if (TREE_CODE (to_arg) != SSA_NAME)
+       {       
+         gsi_next (&gsi_to);
+         continue;
+       }
+      if (get_current_def (to_arg) == NULL_TREE)
        set_current_def (to_arg, get_current_def (from_arg));
+      gsi_next (&gsi_from);
+      gsi_next (&gsi_to);
     }
 }