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

Backported from mainline
	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.

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

From-SVN: r191571
This commit is contained in:
Jakub Jelinek 2012-09-20 17:58:51 +02:00 committed by Jakub Jelinek
parent 6849e07d79
commit 5fef966be1
4 changed files with 40 additions and 1 deletions

View File

@ -1,6 +1,12 @@
2012-09-20 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
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-14 Jakub Jelinek <jakub@redhat.com>
PR target/54564

View File

@ -1,3 +1,11 @@
2012-09-20 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2012-09-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/54563
* g++.dg/torture/pr54563.C: New test.
2012-09-20 Release Manager
* GCC 4.7.2 released.

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.
@ -1387,12 +1387,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))
@ -1430,6 +1436,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
}
break;
@ -1450,6 +1457,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
}
break;
@ -1465,6 +1473,7 @@ execute_cse_sincos (void)
gimple_set_location (new_stmt, loc);
unlink_stmt_vdef (stmt);
gsi_replace (&gsi, new_stmt, true);
cleanup_eh = true;
}
break;
@ -1472,6 +1481,8 @@ execute_cse_sincos (void)
}
}
}
if (cleanup_eh)
cfg_changed |= gimple_purge_dead_eh_edges (bb);
}
statistics_counter_event (cfun, "sincos statements inserted",