re PR tree-optimization/68946 (ICE at -O3 on x86_64-linux-gnu in both 32- and 64...
authorRichard Biener <rguenther@suse.de>
Thu, 17 Dec 2015 14:30:53 +0000 (14:30 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Dec 2015 14:30:53 +0000 (14:30 +0000)
2015-12-17  Richard Biener  <rguenther@suse.de>

PR tree-optimization/68946
* tree-vect-slp.c (vect_slp_analyze_node_operations): Push
SLP def type to stmt operands one stmt at a time.

* gcc.dg/torture/pr68946.c: New testcase.

From-SVN: r231770

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr68946.c [new file with mode: 0644]
gcc/tree-vect-slp.c

index 405d8b0e5a2917302555e2340a1f14d21731d6e9..e1c522800b918f91813593f07d5af026c2957bdf 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-17  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68946
+       * tree-vect-slp.c (vect_slp_analyze_node_operations): Push
+       SLP def type to stmt operands one stmt at a time.
+
 2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * langhooks.h (struct lang_hooks_for_types): New get_bias_field.
index e299f0c7dd35fb079ae68e63d69145854acb4111..976356d42dba26987f4d8f5f0f26e6148e3ecf16 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-17  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68946
+       * gcc.dg/torture/pr68946.c: New testcase.
+
 2015-12-17  Nathan Sidwell  <nathan@acm.org>
 
        * c-c++-common/Wunused-var-13.c: Requires label values.
diff --git a/gcc/testsuite/gcc.dg/torture/pr68946.c b/gcc/testsuite/gcc.dg/torture/pr68946.c
new file mode 100644 (file)
index 0000000..3a1cff4
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-vect-cost-model" } */
+
+int printf (const char *, ...);
+
+int a, b, g;
+short c, e, h, i;
+int f[8];
+void fn1() {
+    short j;
+    for (; a;) {
+       printf("%d", g);
+       b = 7;
+       for (; b >= 0; b--) {
+           i = 1;
+           short k = f[b];
+           e = k ? k : 3;
+           j = (i && (c |= e)) << 3;
+           int l = j, m = 0;
+           h = l < 0 || l >> m;
+           f[b] = h;
+       }
+    }
+}
index 6955e15775e6c8d782036443e1881fe62cfd5d09..7ec20469fe2e0a057888360da1349afa0bf5ee9c 100644 (file)
@@ -2221,12 +2221,6 @@ vect_slp_analyze_node_operations (slp_tree node)
     if (!vect_slp_analyze_node_operations (child))
       return false;
 
-  /* Push SLP node def-type to stmts.  */
-  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
-    if (SLP_TREE_DEF_TYPE (child) != vect_internal_def)
-      FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (child), j, stmt)
-       STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt)) = SLP_TREE_DEF_TYPE (child);
-
   bool res = true;
   FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt)
     {
@@ -2234,19 +2228,21 @@ vect_slp_analyze_node_operations (slp_tree node)
       gcc_assert (stmt_info);
       gcc_assert (STMT_SLP_TYPE (stmt_info) != loop_vect);
 
-      if (!vect_analyze_stmt (stmt, &dummy, node))
-       {
-         res = false;
-         break;
-       }
+      /* Push SLP node def-type to stmt operands.  */
+      FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child)
+       if (SLP_TREE_DEF_TYPE (child) != vect_internal_def)
+         STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[i]))
+           = SLP_TREE_DEF_TYPE (child);
+      res = vect_analyze_stmt (stmt, &dummy, node);
+      /* Restore def-types.  */
+      FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child)
+       if (SLP_TREE_DEF_TYPE (child) != vect_internal_def)
+         STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[i]))
+           = vect_internal_def;
+      if (! res)
+       break;
     }
 
-  /* Restore stmt def-types.  */
-  FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
-    if (SLP_TREE_DEF_TYPE (child) != vect_internal_def)
-      FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (child), j, stmt)
-       STMT_VINFO_DEF_TYPE (vinfo_for_stmt (stmt)) = vect_internal_def;
-
   return res;
 }