]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: [multiple changes]
authorRichard Guenther <rguenther@suse.de>
Mon, 18 Apr 2011 15:25:17 +0000 (15:25 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 18 Apr 2011 15:25:17 +0000 (15:25 +0000)
2011-04-18  Richard Guenther  <rguenther@suse.de>

Backported from 4.6 branch
2011-01-19  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/47290
* tree-eh.c (infinite_empty_loop_p): New function.
(cleanup_empty_eh): Use it.

* g++.dg/torture/pr47290.C: New test.

2010-05-29  Jan Hubicka  <jh@suse.cz>

PR tree-optimization/46364
* cgraphunit.c (cgraph_materialize_clone): Only remove calles, refs
and body;
not the whole node for masters of materialized clones.

* g++.dg/torture/pr46364.C: New testcase.

From-SVN: r172653

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr46364.C [new file with mode: 0644]
gcc/testsuite/g++.dg/torture/pr47290.C [new file with mode: 0644]
gcc/tree-eh.c

index 84eb843a694b01b987394caa48bc9ad31ede7c59..19633f032c8b5c8a8f2765a2414e8bc632c2b23a 100644 (file)
@@ -1,3 +1,19 @@
+2011-04-18  Richard Guenther  <rguenther@suse.de>
+
+       Backported from 4.6 branch
+       2011-01-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/47290
+       * tree-eh.c (infinite_empty_loop_p): New function.
+       (cleanup_empty_eh): Use it.
+
+       2010-05-29  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/46364
+       * cgraphunit.c (cgraph_materialize_clone): Only remove calles, refs
+       and body;
+       not the whole node for masters of materialized clones.
+
 2011-04-18  Richard Guenther  <rguenther@suse.de>
 
        Backported from 4.6 branch
index 39839bfb9d9495c4f8ed17ec88a177e60583b898..0bea59b52214f1d100214b8e2deb574da925a002 100644 (file)
@@ -2259,7 +2259,10 @@ cgraph_materialize_clone (struct cgraph_node *node)
   node->next_sibling_clone = NULL;
   node->prev_sibling_clone = NULL;
   if (!node->clone_of->analyzed && !node->clone_of->clones)
-    cgraph_remove_node (node->clone_of);
+    {
+      cgraph_release_function_body (node->clone_of);
+      cgraph_node_remove_callees (node->clone_of);
+    }
   node->clone_of = NULL;
   bitmap_obstack_release (NULL);
 }
index 36dd99a9c66d770bf0bc99b2c7b9f5899124feb5..97b381221edafac5b7c6123e7e8395d5d9c55813 100644 (file)
@@ -1,3 +1,16 @@
+2011-04-18  Richard Guenther  <rguenther@suse.de>
+
+       Backported from 4.6 branch
+       2011-01-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/47290
+       * g++.dg/torture/pr47290.C: New test.
+
+       2010-05-29  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/46364
+       * g++.dg/torture/pr46364.C: New testcase.
+
 2011-04-18  Richard Guenther  <rguenther@suse.de>
 
        Backported from 4.6 branch 
diff --git a/gcc/testsuite/g++.dg/torture/pr46364.C b/gcc/testsuite/g++.dg/torture/pr46364.C
new file mode 100644 (file)
index 0000000..8098991
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile }
+#include <string>
+
+void a() throw (int);
+void b(std::string const &);
+
+void c(std::string *e)
+{
+  b("");
+
+  try {
+      a();
+  } catch (...) {
+      *e = "";
+  }
+}
+
+void d() {
+    c(0);
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr47290.C b/gcc/testsuite/g++.dg/torture/pr47290.C
new file mode 100644 (file)
index 0000000..b739de5
--- /dev/null
@@ -0,0 +1,19 @@
+// PR tree-optimization/47290
+// { dg-do compile }
+
+struct V
+{
+  V (int = 0);
+  ~V ()
+  {
+    for (;;)
+      ;
+  }
+  int size ();
+};
+
+struct S
+{
+  V a, b;
+  S () : b (a.size ()) {}
+} s;
index b5cf530adc7d72c49fb03174f3c51c43281cc991..62884f3975d665631760832fd833ec9303bcade5 100644 (file)
@@ -1,5 +1,5 @@
 /* Exception handling semantics and decomposition for trees.
-   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+   Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -3688,6 +3688,42 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp)
   return false;
 }
 
+/* Return true if edge E_FIRST is part of an empty infinite loop
+   or leads to such a loop through a series of single successor
+   empty bbs.  */
+
+static bool
+infinite_empty_loop_p (edge e_first)
+{
+  bool inf_loop = false;
+  edge e;
+
+  if (e_first->dest == e_first->src)
+    return true;
+
+  e_first->src->aux = (void *) 1;
+  for (e = e_first; single_succ_p (e->dest); e = single_succ_edge (e->dest))
+    {
+      gimple_stmt_iterator gsi;
+      if (e->dest->aux)
+       {
+         inf_loop = true;
+         break;
+       }
+      e->dest->aux = (void *) 1;
+      gsi = gsi_after_labels (e->dest);
+      if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi)))
+       gsi_next_nondebug (&gsi);
+      if (!gsi_end_p (gsi))
+       break;
+    }
+  e_first->src->aux = NULL;
+  for (e = e_first; e->dest->aux; e = single_succ_edge (e->dest))
+    e->dest->aux = NULL;
+
+  return inf_loop;
+}
+
 /* Examine the block associated with LP to determine if it's an empty
    handler for its EH region.  If so, attempt to redirect EH edges to
    an outer region.  Return true the CFG was updated in any way.  This
@@ -3727,7 +3763,7 @@ cleanup_empty_eh (eh_landing_pad lp)
   if (gsi_end_p (gsi))
     {
       /* For the degenerate case of an infinite loop bail out.  */
-      if (e_out->dest == bb)
+      if (infinite_empty_loop_p (e_out))
        return false;
 
       return cleanup_empty_eh_unsplit (bb, e_out, lp);