Commit afaaa67d by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/47290 (memory exhausted compiling a destructor with an…

re PR tree-optimization/47290 (memory exhausted compiling a destructor with an infinite 'for (;;);' loop)

	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.

From-SVN: r168974
parent 2d300fac
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.
2011-01-18 Steve Ellcey <sje@cup.hp.com> 2011-01-18 Steve Ellcey <sje@cup.hp.com>
PR target/46997 PR target/46997
......
2011-01-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/47290
* g++.dg/torture/pr47290.C: New test.
2011-01-18 Janus Weil <janus@gcc.gnu.org> 2011-01-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/47240 PR fortran/47240
......
// 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;
/* Exception handling semantics and decomposition for trees. /* 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. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -3724,6 +3724,42 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp) ...@@ -3724,6 +3724,42 @@ cleanup_empty_eh_unsplit (basic_block bb, edge e_out, eh_landing_pad lp)
return false; 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 /* 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 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 an outer region. Return true the CFG was updated in any way. This
...@@ -3763,7 +3799,7 @@ cleanup_empty_eh (eh_landing_pad lp) ...@@ -3763,7 +3799,7 @@ cleanup_empty_eh (eh_landing_pad lp)
if (gsi_end_p (gsi)) if (gsi_end_p (gsi))
{ {
/* For the degenerate case of an infinite loop bail out. */ /* 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 false;
return cleanup_empty_eh_unsplit (bb, e_out, lp); return cleanup_empty_eh_unsplit (bb, e_out, lp);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment