The following fixes PR69466 - we try to make our lives easier
in vectorization loop manip by duplicating PHIs to random BBs
but fail to realize we can't do that for PHIs with constant args.

The fix for this PR is to simply skip those we can't duplicate
when later lock-step iterating over the source and the dest of
such copy.

A real fix would be to clean up this whole mess ...

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2016-01-28  Richard Biener  <rguent...@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.

Index: gcc/tree-vect-loop-manip.c
===================================================================
--- gcc/tree-vect-loop-manip.c  (revision 232867)
+++ gcc/tree-vect-loop-manip.c  (working copy)
@@ -727,17 +727,26 @@ slpeel_duplicate_current_defs_from_edges
 
   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);
     }
 }
 
Index: gcc/testsuite/gfortran.dg/vect/pr69466.f90
===================================================================
--- gcc/testsuite/gfortran.dg/vect/pr69466.f90  (revision 0)
+++ gcc/testsuite/gfortran.dg/vect/pr69466.f90  (working copy)
@@ -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

Reply via email to