This fixes a crash when we try to re-use a folded loop_vectorized_call
when vectorizing an epilogue.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2017-03-06  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/79894
        * tree-vectorizer.c (vectorize_loops): Set loop_vectorized_call
        to NULL after folding it.

        * gcc.dg/vect/pr79887.c: New testcase.

Index: gcc/tree-vectorizer.c
===================================================================
--- gcc/tree-vectorizer.c       (revision 245908)
+++ gcc/tree-vectorizer.c       (working copy)
@@ -651,6 +651,7 @@ vectorize_loops (void)
                                     "basic block vectorized\n");
                    fold_loop_vectorized_call (loop_vectorized_call,
                                               boolean_true_node);
+                   loop_vectorized_call = NULL;
                    ret |= TODO_cleanup_cfg;
                  }
              }
@@ -703,6 +704,7 @@ vectorize_loops (void)
        if (loop_vectorized_call)
          {
            fold_loop_vectorized_call (loop_vectorized_call, boolean_true_node);
+           loop_vectorized_call = NULL;
            ret |= TODO_cleanup_cfg;
          }
 
Index: gcc/testsuite/gcc.dg/vect/pr79887.c
===================================================================
--- gcc/testsuite/gcc.dg/vect/pr79887.c (nonexistent)
+++ gcc/testsuite/gcc.dg/vect/pr79887.c (working copy)
@@ -0,0 +1,14 @@
+/* Test for pr79887.  */
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_condition } */
+/* { dg-additional-options "-fno-trapping-math --param 
vect-epilogues-nomask=1" } */
+/* { dg-additional-options "-mavx512ifma" { target x86_64-*-* i?86-*-* } } */
+
+void
+foo (float a[32], float b[2][32])
+{
+  int i;
+  for (i = 0; i < 32; i++)
+    a[i] = (b[0][i] > b[1][i]) ? b[0][i] : b[1][i];
+}
+

Reply via email to