#!/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 3, 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, 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, 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)"))
   }
}
