#!/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 *.life dumps.  You need to pass the -df 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 ("%-27s %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)"))
   }
}
