The following fixes the case where we're vectorizing the inner loop of an if-converted scalar version of a outer loop. In this case we cannot re-use the if-conversion version because the not vectorized path would fall into the code intended for outer loop vectorization.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2019-06-21 Richard Biener <rguent...@suse.de> PR tree-optimization/90913 * tree-vect-loop-manip.c (vect_loop_versioning): Do not re-use the scalar variant of if-conversion versioning. * gfortran.dg/vect/pr90913.f90: New testcase. Index: gcc/tree-vect-loop-manip.c =================================================================== --- gcc/tree-vect-loop-manip.c (revision 272422) +++ gcc/tree-vect-loop-manip.c (working copy) @@ -3095,9 +3095,12 @@ vect_loop_versioning (loop_vec_info loop } /* Apply versioning. If there is already a scalar version created by - if-conversion re-use that. */ + if-conversion re-use that. Note we cannot re-use the copy of + an if-converted outer-loop when vectorizing the inner loop only. */ gcond *cond; - if (gimple *call = vect_loop_vectorized_call (loop_to_version, &cond)) + gimple *call; + if ((!loop_to_version->inner || loop == loop_to_version) + && (call = vect_loop_vectorized_call (loop_to_version, &cond))) { gcc_assert (scalar_loop); condition_bb = gimple_bb (cond); Index: gcc/testsuite/gfortran.dg/vect/pr90913.f90 =================================================================== --- gcc/testsuite/gfortran.dg/vect/pr90913.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/vect/pr90913.f90 (working copy) @@ -0,0 +1,22 @@ +! { dg-do compile } +! { dg-options "-O3 -ffast-math" } +! { dg-additional-options "-mavx -mveclibabi=svml" { target i?86-*-* x86_64-*-* } } +subroutine foo (a, b, c, d, e, f, g, h, k, l) + implicit none + integer :: d, e, f, g, i, j + real :: a, b(5,6), c(6), h(6,10,5), k(5,10,2), l(10,5), m, n, o + do i=1,5 + do j=1,6 + m=l(f,g)*log(c(j)) + if (m<2) then + if (m<-2) then + h(j,f,g)=n + else + h(j,f,g)=o + endif + endif + b(i,j)=a+k(i,d,e)+k(i,1,e)**h(j,f,g) + enddo + enddo + write(*,'()') +end