re PR tree-optimization/56695 (ICE in expand_vec_cond_expr, at optabs.c:6751)
authorMarek Polacek <polacek@redhat.com>
Thu, 28 Mar 2013 11:14:44 +0000 (11:14 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Thu, 28 Mar 2013 11:14:44 +0000 (11:14 +0000)
PR tree-optimization/56695
* tree-vect-stmts.c (vectorizable_condition): Unconditionally
build signed result of a vector comparison.
* tree-cfg.c (verify_gimple_comparison): Check that a result
of a vector comparison has signed type.

Co-Authored-By: Richard Biener <rguenther@suse.de>
From-SVN: r197192

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr56695.c [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-vect-stmts.c

index 8a96fcb7cdb3d54095fe2812f8b409ff724b94b7..327a71c936daf9d95efd83a81eedb869488bbf06 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-28  Marek Polacek  <polacek@redhat.com>
+           Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56695
+       * tree-vect-stmts.c (vectorizable_condition): Unconditionally
+       build signed result of a vector comparison.
+       * tree-cfg.c (verify_gimple_comparison): Check that a result
+       of a vector comparison has signed type.
+
 2013-03-28  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/37021
index ca732361f513c2e1ad04bd7f71d2bbaca621f358..08b9e59ed825a2eb0b31af5d6c3e3ffde2015b04 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-28  Marek Polacek  <polacek@redhat.com>
+
+       PR tree-optimization/56695
+       * gcc.dg/vect/pr56695.c: New test.
+
 2013-03-28  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/37021
diff --git a/gcc/testsuite/gcc.dg/vect/pr56695.c b/gcc/testsuite/gcc.dg/vect/pr56695.c
new file mode 100644 (file)
index 0000000..8b997c2
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR tree-optimization/56695 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize" } */
+
+int a, b, i;
+
+void
+f (void)
+{
+  for (i = 0; i < 8; ++i)
+    a |= !(i |= b %= 1);
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
index c3771e54fd0f7983754d4de8c07c92ca1859cfa3..3843b139eff968e16a103e909318d7b3c268e19e 100644 (file)
@@ -3191,7 +3191,10 @@ verify_gimple_comparison (tree type, tree op0, tree op1)
 
       if (TYPE_VECTOR_SUBPARTS (type) != TYPE_VECTOR_SUBPARTS (op0_type)
          || (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (type)))
-             != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0_type)))))
+             != GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0_type))))
+         /* The result of a vector comparison is of signed
+            integral type.  */
+         || TYPE_UNSIGNED (TREE_TYPE (type)))
         {
           error ("invalid vector comparison resulting type");
           debug_generic_expr (type);
index 4bd841564188d71214c0d34f57bf1ceba4050f41..9cadc50a8bb26e74c9c6956bdc6f09b9cfaf4705 100644 (file)
@@ -5279,7 +5279,7 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi,
   vec<tree> vec_oprnds1 = vNULL;
   vec<tree> vec_oprnds2 = vNULL;
   vec<tree> vec_oprnds3 = vNULL;
-  tree vec_cmp_type = vectype;
+  tree vec_cmp_type;
 
   if (slp_node || PURE_SLP_STMT (stmt_info))
     ncopies = 1;
@@ -5352,14 +5352,12 @@ vectorizable_condition (gimple stmt, gimple_stmt_iterator *gsi,
           && TREE_CODE (else_clause) != FIXED_CST)
     return false;
 
-  if (!INTEGRAL_TYPE_P (TREE_TYPE (vectype)))
-    {
-      unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vectype)));
-      tree cmp_type = build_nonstandard_integer_type (prec, 1);
-      vec_cmp_type = get_same_sized_vectype (cmp_type, vectype);
-      if (vec_cmp_type == NULL_TREE)
-       return false;
-    }
+  unsigned int prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vectype)));
+  /* The result of a vector comparison should be signed type.  */
+  tree cmp_type = build_nonstandard_integer_type (prec, 0);
+  vec_cmp_type = get_same_sized_vectype (cmp_type, vectype);
+  if (vec_cmp_type == NULL_TREE)
+    return false;
 
   if (!vec_stmt)
     {