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