[PATCH] Optimize away unnecessary clobbers (PR tree-optimization/51117)
Jakub Jelinek
jakub@redhat.com
Thu Dec 8 19:57:00 GMT 2011
Hi!
This patch optimizes away clobber stmts that immediately precede
GIMPLE_RETURN or GIMPLE_RESX that throws externally, which allows
doing EH cleanups. For both libstdc++.so.6 and go1 this
results in slight reduction of .gcc_except_table size:
$ readelf -WS obj96[24]/x86*/libstdc*/src/.libs/libstdc++.so.6 | grep gcc_except_table
[16] .gcc_except_table PROGBITS 00000000000e4714 0e4714 004d1c 00 A 0 0 4
[16] .gcc_except_table PROGBITS 00000000000e425c 0e425c 004964 00 A 0 0 4
$ readelf -WS obj96[24]/gcc/go1 | grep gcc_except_table
[17] .gcc_except_table PROGBITS 000000000160c7fc 120c7fc 003d75 00 A 0 0 4
[17] .gcc_except_table PROGBITS 000000000160c914 120c914 0039be 00 A 0 0 4
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2011-12-08 Jakub Jelinek <jakub@redhat.com>
Andrew Pinski <apinski@cavium.com>
PR tree-optimization/51117
* tree-eh.c (optimize_clobbers): New function.
(execute_lower_eh_dispatch): Call it.
--- gcc/tree-eh.c.jj 2011-12-01 11:45:06.000000000 +0100
+++ gcc/tree-eh.c 2011-12-08 17:48:58.009908793 +0100
@@ -3173,6 +3173,30 @@ struct gimple_opt_pass pass_lower_resx =
}
};
+/* Try to optimize var = {v} {CLOBBER} stmts followed just by return
+ or 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,17 @@ 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_RETURN
+ || (gimple_code (last) == GIMPLE_RESX
+ && stmt_can_throw_external (last)))
+ optimize_clobbers (bb);
}
if (redirected)
Jakub
More information about the Gcc-patches
mailing list