]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/45316 (ICE: verify_flow_info failed: BB 3 can not throw but has...
authorRichard Guenther <rguenther@suse.de>
Wed, 25 Aug 2010 12:53:30 +0000 (12:53 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 25 Aug 2010 12:53:30 +0000 (12:53 +0000)
2010-08-25  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/45316
* tree-ssa-pre.c (eliminate): Properly clean EH info.

* g++.dg/opt/pr45316.C: New testcase.

From-SVN: r163543

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr45316.C [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 9f85999a3548373a22d0f394c7e794801d44876d..b3ff5165212d73894a29b3ee384b56ab68538ec5 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-25  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/45316
+       * tree-ssa-pre.c (eliminate): Properly clean EH info.
+
 2010-08-25  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/45393
index c8871f71e39f41383835e241de843a62b308117a..ba13e9e8fb90f2150a873c44bcad088ddb9b430e 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-25  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/45316
+       * g++.dg/opt/pr45316.C: New testcase.
+
 2010-08-25  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/45393
diff --git a/gcc/testsuite/g++.dg/opt/pr45316.C b/gcc/testsuite/g++.dg/opt/pr45316.C
new file mode 100644 (file)
index 0000000..74ad30e
--- /dev/null
@@ -0,0 +1,28 @@
+// { dg-do compile }
+// { dg-options "-O1 -ftree-pre -fnon-call-exceptions" }
+
+struct A
+{
+  int i;
+};
+
+struct B : A
+{
+  int i[6];
+  B (int = 0) : A ()
+  {
+    m ();
+  }
+  int m ();
+};
+
+struct C : B
+{
+};
+
+void
+foo ()
+{
+  new C ();
+}
+
index 6d481231a87bfc63019b7ed1f496ac35a6eeb6bf..fd3da9e9a208adcf0044fe905cc5bd6e3b01cb15 100644 (file)
@@ -4498,9 +4498,12 @@ eliminate (void)
       if (TREE_CODE (lhs) != SSA_NAME
          || has_zero_uses (lhs))
        {
+         basic_block bb = gimple_bb (stmt);
          gsi = gsi_for_stmt (stmt);
          unlink_stmt_vdef (stmt);
          gsi_remove (&gsi, true);
+         if (gimple_purge_dead_eh_edges (bb))
+           todo |= TODO_cleanup_cfg;
          if (TREE_CODE (lhs) == SSA_NAME)
            bitmap_clear_bit (inserted_exprs, SSA_NAME_VERSION (lhs));
          release_defs (stmt);