Hi,

Here is a trivial patch to fix boolean vector invariants.  Bootstrapped and 
tested on x86_64-pc-linux-gnu.  Applied to trunk.

Thanks,
Ilya
--
gcc/

2015-12-18  Ilya Enkovich  <enkovich....@gmail.com>

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

gcc/testsuite

2015-12-18  Ilya Enkovich  <enkovich....@gmail.com>

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


diff --git a/gcc/testsuite/gcc.target/i386/pr68956.c 
b/gcc/testsuite/gcc.target/i386/pr68956.c
new file mode 100644
index 0000000..4fb2ced
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr68956.c
@@ -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 ();
+    }
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index b1342fb..7c6fa73 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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;

Reply via email to