OSDN Git Service

* predict.c (estimate_probability): Added the pointer heuristic to
authorjle <jle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Feb 2000 23:04:43 +0000 (23:04 +0000)
committerjle <jle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 21 Feb 2000 23:04:43 +0000 (23:04 +0000)
        the collection of static branch predictors.

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

gcc/ChangeLog
gcc/predict.c

index 3378818..f6e5897 100644 (file)
@@ -1,3 +1,8 @@
+Mon Feb 21 17:06:27 2000  Jason Eckhardt  <jle@cygnus.com>
+
+       * predict.c (estimate_probability): Added the pointer heuristic to
+       the collection of static branch predictors.
+
 2000-02-21  Catherine Moore  <clm@cygnus.com>
 
        * config/mips/mips.h (ASM_SPEC): Add -mfix700.
index d8a588f..2cae39a 100644 (file)
@@ -95,7 +95,10 @@ estimate_probability (loops_info)
        }
     }
 
-  /* Try to predict condjumps using same algorithm as mostly_true_jump.  */
+  /* Attempt to predict conditional jumps using a number of heuristics.
+     For each conditional jump, we try each heuristic in a fixed order.
+     If more than one heuristic applies to a particular branch, the first
+     is used as the prediction for the branch.  */
   for (i = 0; i < n_basic_blocks - 1; i++)
     {
       rtx last_insn = BLOCK_END (i);
@@ -108,7 +111,39 @@ estimate_probability (loops_info)
       cond = get_condition (last_insn, &earliest);
       if (! cond)
        continue;
-      /* EQ tests are usually false and NE tests are usually true.  Also,
+
+      /* 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:
+         if (GET_CODE (XEXP (cond, 0)) == REG
+             && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 0)))
+             && (XEXP (cond, 1) == const0_rtx
+                 || (GET_CODE (XEXP (cond, 1)) == REG
+                     && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
+           prob = REG_BR_PROB_BASE / 10;
+         break;
+       case NE:
+         if (GET_CODE (XEXP (cond, 0)) == REG
+             && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 0)))
+             && (XEXP (cond, 1) == const0_rtx
+                 || (GET_CODE (XEXP (cond, 1)) == REG
+                     && REGNO_POINTER_FLAG (REGNO (XEXP (cond, 1))))))
+           prob = REG_BR_PROB_BASE / 2;
+         break;
+       default:
+         prob = 0;
+       }
+       if (prob && ! 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));
+
+      /* Try "opcode heuristic."
+        EQ tests are usually false and NE tests are usually true. Also,
         most quantities are positive, so we can make the appropriate guesses
         about signed comparisons against zero.  */
       switch (GET_CODE (cond))