]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR rtl-optimization/46204 (g++.dg/torture/stackalign/throw-1.C fails...
authorAndrey Belevantsev <abel@ispras.ru>
Thu, 7 Apr 2011 06:51:49 +0000 (10:51 +0400)
committerAndrey Belevantsev <abel@gcc.gnu.org>
Thu, 7 Apr 2011 06:51:49 +0000 (10:51 +0400)
        Backport from mainline
        2010-11-12  Alexander Monakov  <amonakov@ispras.ru>

        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
gcc/sel-sched-ir.c

index 78d9d95ed447d9dfe7a32c1a71d66269fe1d3a81..0552426b558e19dd1b447e52b01000a626ade4da 100644 (file)
@@ -1,3 +1,13 @@
+2011-04-07  Andrey Belevantsev  <abel@ispras.ru>
+
+       Backport from mainline
+       2010-11-12  Alexander Monakov  <amonakov@ispras.ru>
+
+       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  <abel@ispras.ru>
 
        Backport from mainline
index 9ebfa76d6ebb88485aebe9021ee2c1075523ecbd..3a8f4394ed7f7dd301cc6c2a7f055930a624f7c4 100644 (file)
@@ -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++;