predict.c (estimate_probability): New heuristic...
authorZack Weinberg <zack@wolery.cumb.org>
Fri, 21 Apr 2000 16:19:20 +0000 (16:19 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Fri, 21 Apr 2000 16:19:20 +0000 (16:19 +0000)
* predict.c (estimate_probability): New heuristic: if a jump
branches around a block with no successors, predict it taken.
Disentangle control flow.

From-SVN: r33308

gcc/ChangeLog
gcc/predict.c

index 99659e9eef484470abbff46347423cac7e5aa904..733d02d43e6064feb5483a4702be9b691d07b52b 100644 (file)
@@ -1,3 +1,9 @@
+2000-04-21  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * predict.c (estimate_probability): New heuristic: if a jump
+       branches around a block with no successors, predict it taken.
+       Disentangle control flow.
+
 2000-04-20  Richard Henderson  <rth@cygnus.com>
 
        * loop.c (emit_iv_add_mult): Revert last change.
index 958dbf925b8babb31fb3e3c7a163b6a820044da3..7ed470929afbab10e868f9dfff85ac14dee85035 100644 (file)
@@ -104,18 +104,37 @@ estimate_probability (loops_info)
       rtx last_insn = BLOCK_END (i);
       rtx cond, earliest;
       int prob = 0;
+      edge e;
 
       if (GET_CODE (last_insn) != JUMP_INSN
          || ! condjump_p (last_insn) || simplejump_p (last_insn))
        continue;
+      if (find_reg_note (last_insn, REG_BR_PROB, 0))
+       continue;
       cond = get_condition (last_insn, &earliest);
       if (! cond)
        continue;
 
+      /* If the jump branches around a block with no successors,
+        predict it to be taken.  */
+      prob = 0;
+      for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
+       if ((e->flags & EDGE_FALLTHRU) && e->dest->succ == NULL)
+         {
+           prob = REG_BR_PROB_BASE;
+           break;
+         }
+      if (prob)
+       {
+         REG_NOTES (last_insn)
+           = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
+                                REG_NOTES (last_insn));
+         continue;
+       }
+
       /* Try "pointer heuristic."
         A comparison ptr == 0 is predicted as false.
         Similarly, a comparison ptr1 == ptr2 is predicted as false.  */
-      prob = 0;
       switch (GET_CODE (cond))
        {
        case EQ:
@@ -137,10 +156,13 @@ estimate_probability (loops_info)
        default:
          prob = 0;
        }
-       if (prob && ! find_reg_note (last_insn, REG_BR_PROB, 0))
+      if (prob)
+       {
          REG_NOTES (last_insn)
            = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
                                 REG_NOTES (last_insn));
+         continue;
+       }
 
       /* Try "opcode heuristic."
         EQ tests are usually false and NE tests are usually true. Also,
@@ -174,10 +196,9 @@ estimate_probability (loops_info)
        default:
          prob = 0;
        }
-      if (! find_reg_note (last_insn, REG_BR_PROB, 0))
-       REG_NOTES (last_insn)
-         = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
-                              REG_NOTES (last_insn));
+      REG_NOTES (last_insn)
+       = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
+                            REG_NOTES (last_insn));
     }
 }
 \f