diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-12-09 12:48:30 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-12-09 12:48:30 +0100 |
commit | 960f0c9d4ccb8aab58523501f0e37749c526f18a (patch) | |
tree | 86f7e6b8be7c7cb9e9b1f9e6d32217ba2cc8a32a /gcc/tree-eh.c | |
parent | 48f2e3734233184ff3b7e6f6bc0c27c474a76d29 (diff) | |
download | gcc-960f0c9d4ccb8aab58523501f0e37749c526f18a.zip gcc-960f0c9d4ccb8aab58523501f0e37749c526f18a.tar.gz gcc-960f0c9d4ccb8aab58523501f0e37749c526f18a.tar.bz2 |
re PR tree-optimization/51117 (rev.181172 causes glibc build failure)
PR tree-optimization/51117
* tree-eh.c (optimize_clobbers): New function.
(execute_lower_eh_dispatch): Call it.
Co-Authored-By: Andrew Pinski <apinski@cavium.com>
From-SVN: r182158
Diffstat (limited to 'gcc/tree-eh.c')
-rw-r--r-- | gcc/tree-eh.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 57abca8..7fc850a 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -3173,6 +3173,30 @@ struct gimple_opt_pass pass_lower_resx = } }; +/* Try to optimize var = {v} {CLOBBER} stmts followed just by + external throw. */ + +static void +optimize_clobbers (basic_block bb) +{ + gimple_stmt_iterator gsi = gsi_last_bb (bb); + for (gsi_prev (&gsi); !gsi_end_p (gsi);) + { + gimple stmt = gsi_stmt (gsi); + if (is_gimple_debug (stmt)) + { + gsi_prev (&gsi); + continue; + } + if (!gimple_assign_single_p (stmt) + || TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME + || !TREE_CLOBBER_P (gimple_assign_rhs1 (stmt))) + return; + unlink_stmt_vdef (stmt); + gsi_remove (&gsi, true); + release_defs (stmt); + } +} /* At the end of inlining, we can lower EH_DISPATCH. Return true when we have found some duplicate labels and removed some edges. */ @@ -3337,11 +3361,16 @@ execute_lower_eh_dispatch (void) FOR_EACH_BB (bb) { gimple last = last_stmt (bb); - if (last && gimple_code (last) == GIMPLE_EH_DISPATCH) + if (last == NULL) + continue; + if (gimple_code (last) == GIMPLE_EH_DISPATCH) { redirected |= lower_eh_dispatch (bb, last); any_rewritten = true; } + else if (gimple_code (last) == GIMPLE_RESX + && stmt_can_throw_external (last)) + optimize_clobbers (bb); } if (redirected) |