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:
parent
b4a642cb4e
commit
3b9ee1cc73
4 changed files with 37 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
14
gcc/testsuite/g++.dg/torture/pr54563.C
Normal file
14
gcc/testsuite/g++.dg/torture/pr54563.C
Normal 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.);
|
||||
}
|
|
@ -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",
|
||||
|
|
Loading…
Add table
Reference in a new issue