aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-12-12 21:59:28 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-12-12 21:59:28 +0100
commitc88388e6745fb65bbc41c1e941c41f02ff27e4b7 (patch)
treed9ebb1c9ea36d449c1e94f5161ff2d92f15b634d /gcc/gimple-fold.c
parent9c3b03463a63d80970178d7df77bb36e19ee9e0b (diff)
downloadgcc-c88388e6745fb65bbc41c1e941c41f02ff27e4b7.zip
gcc-c88388e6745fb65bbc41c1e941c41f02ff27e4b7.tar.gz
gcc-c88388e6745fb65bbc41c1e941c41f02ff27e4b7.tar.bz2
re PR tree-optimization/51481 (ice: dead STMT in EH table)
PR tree-optimization/51481 * gimple-fold.c (gimple_fold_call): Call maybe_clean_or_replace_eh_stmt. Avoid optimization if stmt has EH edges, but gimple_fold_builtin result can't throw. * gcc.dg/pr51481.c: New test. From-SVN: r182264
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 91dd8fc..4afced8 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -1117,10 +1117,21 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
if (callee && DECL_BUILT_IN (callee))
{
tree result = gimple_fold_builtin (stmt);
- if (result)
+ if (result
+ /* Disallow EH edge removal here. We can't call
+ gimple_purge_dead_eh_edges here. */
+ && (lookup_stmt_eh_lp (stmt) == 0
+ || tree_could_throw_p (result)))
{
if (!update_call_from_tree (gsi, result))
gimplify_and_update_call_from_tree (gsi, result);
+ if (!gsi_end_p (*gsi))
+ {
+ gimple new_stmt = gsi_stmt (*gsi);
+ bool update_eh ATTRIBUTE_UNUSED
+ = maybe_clean_or_replace_eh_stmt (stmt, new_stmt);
+ gcc_assert (!update_eh);
+ }
changed = true;
}
}