re PR tree-optimization/63593 (ICE: verify_gimple failed: incompatible types in PHI...
authorRichard Biener <rguenther@suse.de>
Mon, 16 Feb 2015 14:52:14 +0000 (14:52 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 16 Feb 2015 14:52:14 +0000 (14:52 +0000)
2015-02-16  Richard Biener  <rguenther@suse.de>

PR tree-optimization/63593
* tree-predcom.c (execute_pred_commoning_chain): Delay removing
stmts and releasing SSA names until...
(execute_pred_commoning): ... after processing all chains.

* gcc.dg/pr63593.c: New testcase.

From-SVN: r220734

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr63593.c [new file with mode: 0644]
gcc/tree-predcom.c

index 2718a5c4ce36d446399d93dcf020ebd55bb7d477..4062b065bad9a17566d2fca4370f3a6ead17906f 100644 (file)
@@ -1,3 +1,10 @@
+2015-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/63593
+       * tree-predcom.c (execute_pred_commoning_chain): Delay removing
+       stmts and releasing SSA names until...
+       (execute_pred_commoning): ... after processing all chains.
+
 2015-02-16  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/65059
index edbb95d56187de866207b588da7ab9723ca23f86..c02263ea5cceeea02c3eb3fad349ca08bea25ed9 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/63593
+       * gcc.dg/pr63593.c: New testcase.
+
 2015-02-16  Marek Polacek  <polacek@redhat.com>
 
        PR c/65066
diff --git a/gcc/testsuite/gcc.dg/pr63593.c b/gcc/testsuite/gcc.dg/pr63593.c
new file mode 100644 (file)
index 0000000..08bc8f9
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-tree-vectorize" } */
+
+int in[2 * 4][4];
+int out[4];
+
+void
+foo (void)
+{
+  int sum;
+  int i, j, k;
+  for (k = 0; k < 4; k++)
+    {
+      sum = 1;
+      for (j = 0; j < 4; j++)
+       for (i = 0; i < 4; i++)
+         sum *= in[i + k][j];
+      out[k] = sum;
+    }
+}
index ac32c849a121559bd3663aa31c965f8a76e8a47f..8dac1ba5afd5520368e20596d643a716b1982a5a 100644 (file)
@@ -1745,9 +1745,8 @@ execute_pred_commoning_chain (struct loop *loop, chain_p chain,
   if (chain->combined)
     {
       /* For combined chains, just remove the statements that are used to
-        compute the values of the expression (except for the root one).  */
-      for (i = 1; chain->refs.iterate (i, &a); i++)
-       remove_stmt (a->stmt);
+        compute the values of the expression (except for the root one).
+        We delay this until after all chains are processed.  */
     }
   else
     {
@@ -1811,6 +1810,21 @@ execute_pred_commoning (struct loop *loop, vec<chain_p> chains,
        execute_pred_commoning_chain (loop, chain, tmp_vars);
     }
 
+  FOR_EACH_VEC_ELT (chains, i, chain)
+    {
+      if (chain->type == CT_INVARIANT)
+       ;
+      else if (chain->combined)
+       {
+         /* For combined chains, just remove the statements that are used to
+            compute the values of the expression (except for the root one).  */
+         dref a;
+         unsigned j;
+         for (j = 1; chain->refs.iterate (j, &a); j++)
+           remove_stmt (a->stmt);
+       }
+    }
+
   update_ssa (TODO_update_ssa_only_virtuals);
 }