+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
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);
}
+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
/* 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.
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
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);