Message ID | 20111208195740.GQ1957@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
On 12/08/2011 11:57 AM, Jakub Jelinek wrote: > + else if (gimple_code (last) == GIMPLE_RETURN > + || (gimple_code (last) == GIMPLE_RESX > + && stmt_can_throw_external (last))) > + optimize_clobbers (bb); If you need to do this for returns as well as resx, then this is the wrong place, since we'll only get here if there are exception regions in the current function. If you don't need to do this for returns... why do them? r~
On Thu, Dec 08, 2011 at 03:53:40PM -0800, Richard Henderson wrote: > On 12/08/2011 11:57 AM, Jakub Jelinek wrote: > > + else if (gimple_code (last) == GIMPLE_RETURN > > + || (gimple_code (last) == GIMPLE_RESX > > + && stmt_can_throw_external (last))) > > + optimize_clobbers (bb); > > If you need to do this for returns as well as resx, then > this is the wrong place, since we'll only get here if there > are exception regions in the current function. I don't need to do it for returns, on the other side those clobbers before return are useless and removing them perhaps might decrease memory consumptions (after collect). But if you prefer to keep it just for GIMPLE_RESX, fine with me. It can be done anywhere else after inlining and before ehcleanup2 too if you have suggestions where to do it instead. Jakub
On 12/08/2011 04:00 PM, Jakub Jelinek wrote: > On Thu, Dec 08, 2011 at 03:53:40PM -0800, Richard Henderson wrote: >> On 12/08/2011 11:57 AM, Jakub Jelinek wrote: >>> + else if (gimple_code (last) == GIMPLE_RETURN >>> + || (gimple_code (last) == GIMPLE_RESX >>> + && stmt_can_throw_external (last))) >>> + optimize_clobbers (bb); >> >> If you need to do this for returns as well as resx, then >> this is the wrong place, since we'll only get here if there >> are exception regions in the current function. > > I don't need to do it for returns, on the other side those clobbers > before return are useless and removing them perhaps might decrease > memory consumptions (after collect). > > But if you prefer to keep it just for GIMPLE_RESX, fine with me. > > It can be done anywhere else after inlining and before ehcleanup2 > too if you have suggestions where to do it instead. *shrug* Maybe just a new pass immediately before ehcleanup2? It's just a quick pass over the basic blocks... r~
On Fri, Dec 9, 2011 at 1:24 AM, Richard Henderson <rth@redhat.com> wrote: > On 12/08/2011 04:00 PM, Jakub Jelinek wrote: >> On Thu, Dec 08, 2011 at 03:53:40PM -0800, Richard Henderson wrote: >>> On 12/08/2011 11:57 AM, Jakub Jelinek wrote: >>>> + else if (gimple_code (last) == GIMPLE_RETURN >>>> + || (gimple_code (last) == GIMPLE_RESX >>>> + && stmt_can_throw_external (last))) >>>> + optimize_clobbers (bb); >>> >>> If you need to do this for returns as well as resx, then >>> this is the wrong place, since we'll only get here if there >>> are exception regions in the current function. >> >> I don't need to do it for returns, on the other side those clobbers >> before return are useless and removing them perhaps might decrease >> memory consumptions (after collect). >> >> But if you prefer to keep it just for GIMPLE_RESX, fine with me. >> >> It can be done anywhere else after inlining and before ehcleanup2 >> too if you have suggestions where to do it instead. > > *shrug* Maybe just a new pass immediately before ehcleanup2? > It's just a quick pass over the basic blocks... I'd just not care for the ones preceeding a return. Not at this point at least. Richard. > > r~
--- 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)