re PR tree-optimization/47639 (ICE: verify_stmts failed: statement marked for throw...
authorRichard Guenther <rguenther@suse.de>
Tue, 8 Feb 2011 14:16:50 +0000 (14:16 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 8 Feb 2011 14:16:50 +0000 (14:16 +0000)
2011-02-08  Richard Guenther  <rguenther@suse.de>

PR middle-end/47639
* tree-vect-generic.c (expand_vector_operations_1): Update
stmts here ...
(expand_vector_operations): ... not here.  Cleanup EH info
and the CFG if required.

* g++.dg/opt/pr47639.c: New testcase.

From-SVN: r169926

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr47639.c [new file with mode: 0644]
gcc/tree-vect-generic.c

index f22f6673c88206f7e9a95007fb6ee2d851384a02..39a19133872556f710dd2b8c2af38e098a5cc9e8 100644 (file)
@@ -1,3 +1,11 @@
+2011-02-08  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/47639
+       * tree-vect-generic.c (expand_vector_operations_1): Update
+       stmts here ...
+       (expand_vector_operations): ... not here.  Cleanup EH info
+       and the CFG if required.
+
 2011-02-08  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/47641
index 51b225f78ccc8a6839da83a714ae2e54f0147c63..a9c1bf4a6e4b8209b79173c4bb234132476dfdbb 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-08  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/47639
+       * g++.dg/opt/pr47639.c: New testcase.
+
 2011-02-08  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/47632
diff --git a/gcc/testsuite/g++.dg/opt/pr47639.c b/gcc/testsuite/g++.dg/opt/pr47639.c
new file mode 100644 (file)
index 0000000..6ee8bb7
--- /dev/null
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-options "-fnon-call-exceptions" }
+
+typedef int __attribute__ ((vector_size (8))) vec;
+
+vec foo (vec v1, vec v2)
+{
+  try
+    {
+      return v1 / v2;
+    }
+  catch (...)
+    {
+      throw;
+    }
+}
+
index 54a6075a5124e50e42391b12bca79213d35e825d..fce1fc7e1ae0700274d34fa531a61e4a402c1b6e 100644 (file)
@@ -606,8 +606,7 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
      way to do it is change expand_vector_operation and its callees to
      return a tree_code, RHS1 and RHS2 instead of a tree. */
   gimple_assign_set_rhs_from_tree (gsi, new_rhs);
-
-  gimple_set_modified (gsi_stmt (*gsi), true);
+  update_stmt (gsi_stmt (*gsi));
 }
 \f
 /* Use this to lower vector operations introduced by the vectorizer,
@@ -624,16 +623,24 @@ expand_vector_operations (void)
 {
   gimple_stmt_iterator gsi;
   basic_block bb;
+  bool cfg_changed = false;
 
   FOR_EACH_BB (bb)
     {
       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
        {
          expand_vector_operations_1 (&gsi);
-         update_stmt_if_modified (gsi_stmt (gsi));
+         /* ???  If we do not cleanup EH then we will ICE in
+            verification.  But in reality we have created wrong-code
+            as we did not properly transition EH info and edges to
+            the piecewise computations.  */
+         if (maybe_clean_eh_stmt (gsi_stmt (gsi))
+             && gimple_purge_dead_eh_edges (bb))
+           cfg_changed = true;
        }
     }
-  return 0;
+
+  return cfg_changed ? TODO_cleanup_cfg : 0;
 }
 
 struct gimple_opt_pass pass_lower_vector =