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:
parent
6849e07d79
commit
5fef966be1
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.);
|
||||
}
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue