OSDN Git Service

* predict.c (estimate_probability): Examine both sides of
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Apr 2000 19:16:03 +0000 (19:16 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Apr 2000 19:16:03 +0000 (19:16 +0000)
        a branch for no exits.  Use 90% not 50% for predict taken.
        Reorg for one copy of note generation code.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33343 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/predict.c

index 7b3844a..4b12657 100644 (file)
@@ -1,5 +1,11 @@
 2000-04-22  Richard Henderson  <rth@cygnus.com>
 
+       * predict.c (estimate_probability): Examine both sides of
+       a branch for no exits.  Use 90% not 50% for predict taken.
+       Reorg for one copy of note generation code.
+
+2000-04-22  Richard Henderson  <rth@cygnus.com>
+
        * flow.c (mark_used_reg): Hack around rs6000 eliminable pic reg.
 
 2000-04-22  Richard Henderson  <rth@cygnus.com>
index 57b71e2..6900f0e 100644 (file)
@@ -103,34 +103,32 @@ estimate_probability (loops_info)
     {
       rtx last_insn = BLOCK_END (i);
       rtx cond, earliest;
-      int prob = 0;
+      int prob;
       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;
+      /* If one of the successor blocks has no successors, predict
+        that side not taken.  */
+      /* ??? Ought to do the same for any subgraph with no exit.  */
       for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
-       if ((e->flags & EDGE_FALLTHRU) && e->dest->succ == NULL)
+       if (e->dest->succ == NULL)
          {
-           prob = REG_BR_PROB_BASE;
-           break;
+           if (e->flags & EDGE_FALLTHRU)
+             prob = REG_BR_PROB_BASE;
+           else
+             prob = 0;
+           goto emitnote;
          }
-      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.
@@ -143,7 +141,10 @@ estimate_probability (loops_info)
              && (XEXP (cond, 1) == const0_rtx
                  || (GET_CODE (XEXP (cond, 1)) == REG
                      && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
-           prob = REG_BR_PROB_BASE / 10;
+           {
+             prob = REG_BR_PROB_BASE / 10;
+             goto emitnote;
+           }
          break;
        case NE:
          if (GET_CODE (XEXP (cond, 0)) == REG
@@ -151,17 +152,14 @@ estimate_probability (loops_info)
              && (XEXP (cond, 1) == const0_rtx
                  || (GET_CODE (XEXP (cond, 1)) == REG
                      && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
-           prob = REG_BR_PROB_BASE / 2;
+           {
+             prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10);
+             goto emitnote;
+           }
          break;
+
        default:
-         prob = 0;
-       }
-      if (prob)
-       {
-         REG_NOTES (last_insn)
-           = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
-                                REG_NOTES (last_insn));
-         continue;
+         break;
        }
 
       /* Try "opcode heuristic."
@@ -172,30 +170,42 @@ estimate_probability (loops_info)
        {
        case CONST_INT:
          /* Unconditional branch.  */
-         prob = REG_BR_PROB_BASE / 2;
-         break;
+         prob = (cond == const0_rtx ? 0 : REG_BR_PROB_BASE);
+         goto emitnote;
+
        case EQ:
          prob = REG_BR_PROB_BASE / 10;
-         break;
+         goto emitnote;
        case NE:
-         prob = REG_BR_PROB_BASE / 2;
-         break;
+         prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10);
+         goto emitnote;
        case LE:
        case LT:
          if (XEXP (cond, 1) == const0_rtx)
-           prob = REG_BR_PROB_BASE / 10;
+           {
+             prob = REG_BR_PROB_BASE / 10;
+             goto emitnote;
+           }
          break;
        case GE:
        case GT:
          if (XEXP (cond, 1) == const0_rtx
              || (GET_CODE (XEXP (cond, 1)) == CONST_INT
                  && INTVAL (XEXP (cond, 1)) == -1))
-           prob = REG_BR_PROB_BASE / 2;
+           {
+             prob = REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 10);
+             goto emitnote;
+           }
          break;
 
        default:
-         prob = 0;
+         break;
        }
+
+      /* If we havn't chosen something by now, predict 50-50.  */
+      prob = REG_BR_PROB_BASE / 2;
+
+    emitnote:
       REG_NOTES (last_insn)
        = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (prob),
                             REG_NOTES (last_insn));