aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-eh.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-12-09 12:48:30 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-12-09 12:48:30 +0100
commit960f0c9d4ccb8aab58523501f0e37749c526f18a (patch)
tree86f7e6b8be7c7cb9e9b1f9e6d32217ba2cc8a32a /gcc/tree-eh.c
parent48f2e3734233184ff3b7e6f6bc0c27c474a76d29 (diff)
downloadgcc-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.c31
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)