re PR tree-optimization/68956 (Vectorizer miscompilation of 416.gamess)
authorIlya Enkovich <enkovich.gnu@gmail.com>
Fri, 18 Dec 2015 10:01:02 +0000 (10:01 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Fri, 18 Dec 2015 10:01:02 +0000 (10:01 +0000)
gcc/

PR tree-optimization/68956
* tree-vect-stmts.c (vect_init_vector): Fix constants
used for boolean vectors.

gcc/testsuite

PR tree-optimization/68956
* gcc.target/i386/pr68956.c: New test.

From-SVN: r231811

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr68956.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index 69e2d3c631be1affc8e2529affd42e9efa50566d..32a94eb7c32efccbe8f1e7afec99fe63a38cb896 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
+
+       PR tree-optimization/68956
+       * tree-vect-stmts.c (vect_init_vector): Fix constants
+       used for boolean vectors.
+
 2015-12-18  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR rtl-optimization/68796
index c902f9d740fbf7dc806bb1902aaba3c8f86dbf90..6120ed1b2f3015cad583d23dd61dfabc756d8214 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-18  Ilya Enkovich  <enkovich.gnu@gmail.com>
+
+       PR tree-optimization/68956
+       * gcc.target/i386/pr68956.c: New test.
+
 2015-12-18  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        PR rtl-optimization/68796
diff --git a/gcc/testsuite/gcc.target/i386/pr68956.c b/gcc/testsuite/gcc.target/i386/pr68956.c
new file mode 100644 (file)
index 0000000..4fb2ced
--- /dev/null
@@ -0,0 +1,67 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -ffast-math -mfpmath=sse -mavx2 -ftree-vectorize" } */
+/* { dg-require-effective-target avx2 } */
+
+#include "avx2-check.h"
+
+extern void abort (void);
+
+int l;
+
+static void __attribute__((noclone,noinline))
+test1 (double *in1, double *in2, double *out,
+       int l1, int l2, int *n)
+{
+  double sum;
+  int na = n[0];
+  int nb = n[1];
+  int i;
+  _Bool ic, jc;
+
+  jc = (l > na) && (l > nb);
+  for (int i = 0; i < l2; i++)
+    {
+      ic = (i <= na) && (i <= nb);
+      sum = 0;
+      if (ic && jc)
+       sum = in1[i] + in2[i];
+      out[i] = sum;
+    }
+}
+
+static void
+avx2_test (void)
+{
+  double in1[40], in2[40], out[40], sum;
+  int n[2],l1,l2,i,na,nb;
+  _Bool ic, jc;
+
+  l = 0;
+  l1 = 8;
+  l2 = 40;
+  n[0] = 14;
+  n[1] = 13;
+
+  for (i = 0; i < l2; i++)
+    {
+      in1[i] = i;
+      in2[i] = i;
+      out[i] = 0;
+    }
+
+  test1 (in1, in2, out, l1, l2, n);
+
+  na = n[0];
+  nb = n[1];
+
+  jc = (l > na) && (l > nb);
+  for (int i = 0; i < l2; i++)
+    {
+      ic = (i <= na) && (i <= nb);
+      sum = 0;
+      if (ic && jc)
+       sum = in1[i] + in2[i];
+      if (out[i] != sum)
+       abort ();
+    }
+}
index b1342fb477a2a280c7a1c67cc2ae34443e321471..7c6fa73ff484eb7df499bcef226a183917e474c9 100644 (file)
@@ -1304,8 +1304,8 @@ vect_init_vector (gimple *stmt, tree val, tree type, gimple_stmt_iterator *gsi)
             all zeros or all ones value before building a vector.  */
          if (VECTOR_BOOLEAN_TYPE_P (type))
            {
-             tree true_val = build_zero_cst (TREE_TYPE (type));
-             tree false_val = build_all_ones_cst (TREE_TYPE (type));
+             tree true_val = build_all_ones_cst (TREE_TYPE (type));
+             tree false_val = build_zero_cst (TREE_TYPE (type));
 
              if (CONSTANT_CLASS_P (val))
                val = integer_zerop (val) ? false_val : true_val;