bb-reorder: Remove a misfiring micro-optimization (PR96475)
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 7 Aug 2020 01:31:38 +0000 (01:31 +0000)
committerSegher Boessenkool <segher@kernel.crashing.org>
Wed, 9 Sep 2020 16:55:22 +0000 (16:55 +0000)
When the compgotos pass copies the tail of blocks ending in an indirect
jump, there is a micro-optimization to not copy the last one, since the
original block will then just be deleted.  This does not work properly
if cleanup_cfg does not merge all pairs of blocks we expect it to.  It
also does not work if that last block can be merged into multiple
predecessors.

2020-09-09  Segher Boessenkool  <segher@kernel.crashing.org>

PR rtl-optimization/96475
* bb-reorder.c (maybe_duplicate_computed_goto): Remove single_pred_p
micro-optimization.

gcc/bb-reorder.c

index c635010c69fc7d984fe1f7267a83821f07c42a7a..76e56b55a622c321162c91b61aba270b3e76b90d 100644 (file)
@@ -2680,9 +2680,6 @@ make_pass_reorder_blocks (gcc::context *ctxt)
 static bool
 maybe_duplicate_computed_goto (basic_block bb, int max_size)
 {
-  if (single_pred_p (bb))
-    return false;
-
   /* Make sure that the block is small enough.  */
   rtx_insn *insn;
   FOR_BB_INSNS (bb, insn)
@@ -2700,10 +2697,9 @@ maybe_duplicate_computed_goto (basic_block bb, int max_size)
     {
       basic_block pred = e->src;
 
-      /* Do not duplicate BB into PRED if that is the last predecessor, or if
-        we cannot merge a copy of BB with PRED.  */
-      if (single_pred_p (bb)
-         || !single_succ_p (pred)
+      /* Do not duplicate BB into PRED if we cannot merge a copy of BB
+        with PRED.  */
+      if (!single_succ_p (pred)
          || e->flags & EDGE_COMPLEX
          || pred->index < NUM_FIXED_BLOCKS
          || (JUMP_P (BB_END (pred)) && !simplejump_p (BB_END (pred)))