From 43ca7c6cd08febef08b286a53e59afc5dac6c9d7 Mon Sep 17 00:00:00 2001 From: Andrey Belevantsev Date: Thu, 7 Apr 2011 10:51:49 +0400 Subject: [PATCH] backport: re PR rtl-optimization/46204 (g++.dg/torture/stackalign/throw-1.C fails to compile on IA64) Backport from mainline 2010-11-12 Alexander Monakov PR rtl-optimization/46204 sel-sched-ir.c (maybe_tidy_empty_bb): Remove second argument. pdate all callers. Do not recompute topological order. Adjust allthrough edges following a degenerate conditional jump. From-SVN: r172078 --- gcc/ChangeLog | 10 ++++++++++ gcc/sel-sched-ir.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78d9d95ed447..0552426b558e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2011-04-07 Andrey Belevantsev + + Backport from mainline + 2010-11-12 Alexander Monakov + + PR rtl-optimization/46204 + sel-sched-ir.c (maybe_tidy_empty_bb): Remove second argument. + pdate all callers. Do not recompute topological order. Adjust + allthrough edges following a degenerate conditional jump. + 2011-04-07 Andrey Belevantsev Backport from mainline diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 9ebfa76d6ebb..3a8f4394ed7f 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3539,7 +3539,7 @@ sel_recompute_toporder (void) /* Tidy the possibly empty block BB. */ static bool -maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) +maybe_tidy_empty_bb (basic_block bb) { basic_block succ_bb, pred_bb; edge e; @@ -3589,10 +3589,29 @@ maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) if (!(e->flags & EDGE_FALLTHRU)) { - recompute_toporder_p |= sel_redirect_edge_and_branch (e, succ_bb); + /* We can not invalidate computed topological order by moving + the edge destination block (E->SUCC) along a fallthru edge. */ + sel_redirect_edge_and_branch (e, succ_bb); rescan_p = true; break; } + /* If the edge is fallthru, but PRED_BB ends in a conditional jump + to BB (so there is no non-fallthru edge from PRED_BB to BB), we + still have to adjust it. */ + else if (single_succ_p (pred_bb) && any_condjump_p (BB_END (pred_bb))) + { + /* If possible, try to remove the unneeded conditional jump. */ + if (INSN_SCHED_TIMES (BB_END (pred_bb)) == 0 + && !IN_CURRENT_FENCE_P (BB_END (pred_bb))) + { + if (!sel_remove_insn (BB_END (pred_bb), false, false)) + tidy_fallthru_edge (e); + } + else + sel_redirect_edge_and_branch (e, succ_bb); + rescan_p = true; + break; + } } } @@ -3610,9 +3629,6 @@ maybe_tidy_empty_bb (basic_block bb, bool recompute_toporder_p) remove_empty_bb (bb, true); } - if (recompute_toporder_p) - sel_recompute_toporder (); - #ifdef ENABLE_CHECKING verify_backedges (); #endif @@ -3630,7 +3646,7 @@ tidy_control_flow (basic_block xbb, bool full_tidying) insn_t first, last; /* First check whether XBB is empty. */ - changed = maybe_tidy_empty_bb (xbb, false); + changed = maybe_tidy_empty_bb (xbb); if (changed || !full_tidying) return changed; @@ -3694,8 +3710,8 @@ tidy_control_flow (basic_block xbb, bool full_tidying) that contained that jump, becomes empty too. In such case remove it too. */ if (sel_bb_empty_p (xbb->prev_bb)) - changed = maybe_tidy_empty_bb (xbb->prev_bb, recompute_toporder_p); - else if (recompute_toporder_p) + changed = maybe_tidy_empty_bb (xbb->prev_bb); + if (recompute_toporder_p) sel_recompute_toporder (); } @@ -3713,7 +3729,7 @@ purge_empty_blocks (void) { basic_block b = BASIC_BLOCK (BB_TO_BLOCK (i)); - if (maybe_tidy_empty_bb (b, false)) + if (maybe_tidy_empty_bb (b)) continue; i++; -- 2.47.2