diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-12-12 21:59:28 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-12-12 21:59:28 +0100 |
commit | c88388e6745fb65bbc41c1e941c41f02ff27e4b7 (patch) | |
tree | d9ebb1c9ea36d449c1e94f5161ff2d92f15b634d /gcc/gimple-fold.c | |
parent | 9c3b03463a63d80970178d7df77bb36e19ee9e0b (diff) | |
download | gcc-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.c | 13 |
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; } } |