re PR tree-optimization/90913 (ICE in maybe_gen_insn, at optabs.c:7341 since r272239)
authorRichard Biener <rguenther@suse.de>
Fri, 21 Jun 2019 11:10:39 +0000 (11:10 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 21 Jun 2019 11:10:39 +0000 (11:10 +0000)
2019-06-21  Richard Biener  <rguenther@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.

From-SVN: r272545

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

index 3a6b86bd26617c8eecfd8c21c98752b1d817470b..0c75a0f687ecb5b8833b05d64eb9efacd046e1aa 100644 (file)
@@ -1,3 +1,9 @@
+2019-06-21  Richard Biener  <rguenther@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.
+
 2019-06-21  Jakub Jelinek  <jakub@redhat.com>
 
        * omp-low.c (lower_rec_simd_input_clauses): Add rvar2 argument,
index c5bb4508539a8ecc307bda1a3e039ab251eb5fb2..8181bcd752eeb5811257a2a0460996077a9d6711 100644 (file)
@@ -1,3 +1,8 @@
+2019-06-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/90913
+       * gfortran.dg/vect/pr90913.f90: New testcase.
+
 2019-06-21  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.dg/vect/vect-simd-12.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/vect/pr90913.f90 b/gcc/testsuite/gfortran.dg/vect/pr90913.f90
new file mode 100644 (file)
index 0000000..d0f2251
--- /dev/null
@@ -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
index 9cf1d48bda0ec65ac965dd7aaab3bd18780b7d81..c5cabc8633b6d3e293046256d284366f491672b1 100644 (file)
@@ -3095,9 +3095,12 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
     }
 
   /* 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);