#!/usr/bin/awk -f
# Script to analyze experimental results of our branch prediction heuristics
# Contributed by Jan Hubicka, SuSE Inc.
# Copyright (C) 2001, 2003 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING.  If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
#
# This script is used to calculate two basic properties of the branch prediction
# heuristics - coverage and hitrate.  Coverage is number of executions of a given
# branch matched by the heuristics and hitrate is probability that once branch is
# predicted as taken it is really taken.
#
# These values are useful to determine the quality of given heuristics.  Hitrate
# may be directly used in predict.c.
#
# Usage:
#  Step 1: Compile and profile your program.  You need to use -fprofile-arcs
#    flag to get the profiles
#  Step 2: Generate log files.  The information about given heuristics are
#    saved into *.bp dumps.  You need to pass the -db switch to the compiler as well
#    as -fbranch-probabilities to get the results of profiling noted in the dumps.
#    Ensure that there are no "Arc profiling: some edge counts were bad." warnings.
#  Step 3: Run this script to concatenate all *.life files:
#    analyze_brprob `find . -name *.life`
#    the information is collected and print once all files are parsed.  This
#    may take a while.
#    Note that the script does use bc to perform long arithmetic.
#  Step 4: Read the results.  Basically the following table is printed:
#  (this is just an example from a very early stage of branch prediction pass
#   development, so please don't take these numbers seriously)
#
#HEURISTICS                  BRANCHES  (REL)  HITRATE             COVERAGE  (REL)
#opcode                          2889  83.7%  94.96%/ 97.62%      7516383  75.3%
#pointer                          246   7.1%  99.69%/ 99.86%       118791   1.2%
#loop header                      449  13.0%  98.32%/ 99.07%        43553   0.4%
#first match                     3450 100.0%  89.92%/ 97.27%      9979782 100.0%
#loop exit                        924  26.8%  88.95%/ 95.58%      9026266  90.4%
#error return                     150   4.3%  64.48%/ 86.81%       453542   4.5%
#call                             803  23.3%  51.66%/ 98.61%      3614037  36.2%
#loop branch                       51   1.5%  99.26%/ 99.27%        26854   0.3%
#noreturn call                    951  27.6% 100.00%/100.00%      1759809  17.6%
#
#  The heuristic called "first match" is a heuristic used by GCC branch
#  prediction pass and it predicts 89.92% branches correctly.
#
#  The quality of heuristics can be rated using both, coverage and hitrate
#  parameters.  For example "loop branch" heuristics (predicting loopback edge
#  as taken) have both very high hitrate and coverage, so it is very useful.
#  On the other hand, "exit block" heuristics (predicting exit edges as not
#  taken) have good hitrate, but poor coverage, so only 3 branches have been
#  predicted.  The "loop header" heuristic has problems, since it tends to
#  misspredict.
#
#  The implementation of this script is somewhat brute force.  My awk skills
#  are limited.

function longeval(e)
{
  e = "echo \"scale = 2 ;"e"\" | bc"
  e | getline res
  close (e)
  return res
}

BEGIN {nnames = 0}

/^  .* heuristics: .*.$/ {
    name=$0
    sub (/^  /,"",name)
    sub (/ heuristics: .*.$/,"",name)
    if (!(name in branches))
      {
	names[nnames] = name
	branches[name]=0
	counts[name]=0
	hits[name]=0
	phits[name]=0
	nnames++
      }
    branches[name]+=1
  }

/^  .* heuristics: .*. exec [0-9]* hit [0-9]* (.*.)$/ {
    name=$0
    sub (/^  /,"",name)
    sub (/ heuristics: .*. exec [0-9]* hit [0-9]* (.*.)$/,"",name)
    pred=$0
    sub (/^  .* heuristics: /,"",pred)
    sub (/. exec [0-9]* hit [0-9]* (.*.)$/,"",pred)
    count=$0
    sub (/^  .* heuristics: .*. exec /,"",count)
    sub (/ hit [0-9]* (.*.)$/,"",count)
    hit=$0
    sub (/^  .* heuristics: .*. exec [0-9]* hit /,"",hit)
    sub (/ (.*.)$/,"",hit)

    if (int(pred) < 50.0)
      {
        hit = count"-"hit;
      }
    counts[name]=counts[name] "+" count
    hits[name]=hits[name] "+" hit
    phits[name]=phits[name] "+(("hit")<"count"/2)*("count"-("hit"))+(("hit")>="count"/2)*("hit")"

    #BC crashes on long strings.  Irritating.
    if (length(counts[name]) > 2000)
      counts[name] = longeval(counts[name])
    if (length(hits[name]) > 2000)
      hits[name] = longeval(hits[name])
    if (length(phits[name]) > 2000)
      phits[name] = longeval(phits[name])
  }
END {
  # Heuristics called combined predicts just everything.
  maxcounts = longeval(counts["combined"])
  maxbranches = branches["combined"]
  max = names["combined"]
  printf("HEURISTICS                 BRANCHES  (REL)  HITRATE              COVERAGE  (REL)\n")
  for (i = 0; i < nnames ; i++)
   {
     name = names[i]
     counts[name] = longeval(counts[name])
     printf ("%-26s %8i %5.1f%% %6s%% / %6s%% %12s %5.1f%%\n",
	     name,
	     branches[name], branches[name] * 100 / maxbranches,
	     longeval("("hits[name]") * 100 /(" counts[name]"-0.00001)"),
	     longeval("("phits[name]") * 100 /(" counts[name]"-0.00001)"),
	     counts[name], longeval(counts[name]" * 100 / ("maxcounts"-0.00001)"))
   }
}
