re PR middle-end/54563 (ICE in redirect_eh_edge_1, at tree-eh.c:2215)

PR tree-optimization/54563
	* tree-ssa-math-opts.c (execute_cse_sincos): Call
	gimple_purge_dead_eh_edges if last call has been changed.

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

From-SVN: r191378
This commit is contained in:
Jakub Jelinek 2012-09-17 11:18:35 +02:00 committed by Jakub Jelinek
parent b4a642cb4e
commit 3b9ee1cc73
4 changed files with 37 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2012-09-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/54563
* tree-ssa-math-opts.c (execute_cse_sincos): Call
gimple_purge_dead_eh_edges if last call has been changed.
2012-09-17 Georg-Johann Lay <avr@gjlay.de>
PR target/54222

View File

@ -1,3 +1,8 @@
2012-09-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/54563
* g++.dg/torture/pr54563.C: New test.
2012-09-16 Janus Weil <janus@gcc.gnu.org>
PR fortran/54594

View File

@ -0,0 +1,14 @@
// PR tree-optimization/54563
// { dg-do compile }
extern "C" float powf (float, float);
struct S { ~S (); };
double bar ();
double x;
void
foo ()
{
S s;
x = powf (bar (), 2.);
}

View File

@ -1,5 +1,5 @@
/* Global, SSA-based optimizations using mathematical identities.
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
This file is part of GCC.
@ -1378,12 +1378,18 @@ execute_cse_sincos (void)
FOR_EACH_BB (bb)
{
gimple_stmt_iterator gsi;
bool cleanup_eh = false;
for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
tree fndecl;
/* Only the last stmt in a bb could throw, no need to call
gimple_purge_dead_eh_edges if we change something in the middle
of a basic block. */
cleanup_eh = false;
if (is_gimple_call (stmt)
&& gimple_call_lhs (stmt)
&& (fndecl = gimple_call_fndecl (stmt))
@ -1421,6 +1427,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
if (gimple_vdef (stmt))
release_ssa_name (gimple_vdef (stmt));
}
@ -1443,6 +1450,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
if (gimple_vdef (stmt))
release_ssa_name (gimple_vdef (stmt));
}
@ -1460,6 +1468,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
if (gimple_vdef (stmt))
release_ssa_name (gimple_vdef (stmt));
}
@ -1469,6 +1478,8 @@ execute_cse_sincos (void)
}
}
}
if (cleanup_eh)
cfg_changed |= gimple_purge_dead_eh_edges (bb);
}
statistics_counter_event (cfun, "sincos statements inserted",