re PR target/82713 (ICE in ix86_builtin_vectorization_cost, at config/i386/i386.c...
authorJan Hubicka <hubicka@ucw.cz>
Sun, 19 Nov 2017 18:52:54 +0000 (19:52 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 19 Nov 2017 18:52:54 +0000 (18:52 +0000)
PR target/82713
* i386.c (ix86_builtin_vectorization_cost): Be ready for insane
types.

From-SVN: r254933

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr82713.c [new file with mode: 0644]

index 1a6a3abb90f984f071e712445fb7a04346118dad..17aa792a75f9bfaa2764a3b9a042660fda03cd23 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-19  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR target/82713
+       * i386.c (ix86_builtin_vectorization_cost): Be ready for insane
+       types.
+
 2017-11-19  Tom de Vries  <tom@codesourcery.com>
 
        * config/arc/arc.h (FUNCTION_PROFILER): Remove semicolon after
index 835c73db9d23c6b23c991c4a5c6a5d7ba6e8c396..339932e19eeae8716a2772ac6df3c0bdd004f417 100644 (file)
@@ -44628,13 +44628,18 @@ ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
 
       case vector_load:
        index = sse_store_index (mode);
-       gcc_assert (index >= 0);
+       /* See PR82713 - we may end up being called on non-vector type.  */
+       if (index < 0)
+         index = 2;
         return ix86_vec_cost (mode,
                              COSTS_N_INSNS (ix86_cost->sse_load[index]) / 2,
                              true);
 
       case vector_store:
        index = sse_store_index (mode);
+       /* See PR82713 - we may end up being called on non-vector type.  */
+       if (index < 0)
+         index = 2;
         return ix86_vec_cost (mode,
                              COSTS_N_INSNS (ix86_cost->sse_store[index]) / 2,
                              true);
@@ -44647,6 +44652,9 @@ ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
         Do that incrementally.  */
       case unaligned_load:
        index = sse_store_index (mode);
+       /* See PR82713 - we may end up being called on non-vector type.  */
+       if (index < 0)
+         index = 2;
         return ix86_vec_cost (mode,
                              COSTS_N_INSNS
                                 (ix86_cost->sse_unaligned_load[index]) / 2,
@@ -44654,6 +44662,9 @@ ix86_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
 
       case unaligned_store:
        index = sse_store_index (mode);
+       /* See PR82713 - we may end up being called on non-vector type.  */
+       if (index < 0)
+         index = 2;
         return ix86_vec_cost (mode,
                              COSTS_N_INSNS
                                 (ix86_cost->sse_unaligned_store[index]) / 2,
index 705730b57067bc22cce6fab1d8a82c358f037d63..fe7a5284689f03c6507dcd703bfb8a34c0e4803b 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-19  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR target/82713
+       * gcc.target/i386/pr82713.c: New testcase.
+
 2017-11-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/66618
diff --git a/gcc/testsuite/gcc.target/i386/pr82713.c b/gcc/testsuite/gcc.target/i386/pr82713.c
new file mode 100644 (file)
index 0000000..2c2295e
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+* { dg-options "-O3 -mavx512bw" } */
+
+_Bool a[2048];
+int b[2048];
+
+void
+foo ()
+{
+  int i;
+  for (i = 0; i < 2048; i += 4)
+    {
+      a[i] = b[i] <= 10;
+      a[i + 3] = b[i + 1] <= 10;
+      a[i + 2] = b[i + 2] <= 10;
+      a[i + 1] = b[i + 3] <= 10;
+    }
+}
+