Hi Edmar,

I have been testing your patch on our port of GCC4.4.1. The patch
works well, although I stumbled on an issue.

Many of our interesting cases have large case values, so profiling
the default range of values 0 - 255, or even as large as 0 - 2047 is
insufficient. Profiling for a larger ranges is impractical. I am
attempting to use edge frequencies instead of value profile to
effect the same transformation.

We also use an adapted form of the patch below to form sparse clusters
of contiguous large case values and shrink the switch case jump table.
I have merged your work into this patch so we can form a
probability/frequency based balanced decision tree for more likely
cases, and jump tables with clusters otherwise.

http://gcc.gnu.org/ml/gcc-patches/2004-07/msg02479.html


Here's a modified test case from your patch to demonstrate the need
for clusters in addition to cost balanced decision tree.

enum { NEVER=1000, HARDLY=10001, FOO=1002, FOO1=1003, FOO2=1004,
       FOO3=1005, FOO4=1006, OFTEN=2500, BAR=2501, DUMMY=2502,
       DUMMY1=2503, DUMMY2=2504, DUMMY3=2505};

int seq[] = {
  OFTEN, OFTEN, OFTEN, OFTEN, OFTEN, HARDLY,
  BAR, FOO, OFTEN, FOO, OFTEN, HARDLY,
  OFTEN, OFTEN, OFTEN, OFTEN, OFTEN, HARDLY,
  OFTEN, OFTEN, OFTEN, OFTEN, OFTEN, HARDLY,
  OFTEN, OFTEN, OFTEN, OFTEN, OFTEN, HARDLY,
  300, -1, OFTEN, OFTEN, OFTEN, OFTEN, HARDLY,
};
int result;

int
test_it (int k, int i)
{
  int j;

  j = k;
    switch (seq[i])
    {
    case NEVER:
      j = j * i;
      break;
    case FOO:
      j = j + k;
      break;
    case FOO1:
      j = j + k<<2;
      break;
    case FOO2:
      j = j + k<<5;
      break;
    case FOO3:
      j = j + k<<6;
      break;
    case FOO4:
      j = j + k<<7;
      break;
    case BAR:
      j = j + i + k;
    case DUMMY:
      j = j * (k + i);
      break;
    case DUMMY1:
      j = j * (k + i<<2);
      break;
    case OFTEN:
      j = j + i;
      break;
    case DUMMY2:
      j = j * (k + i<<5);
      break;
    case DUMMY3:
      j = j * (k + i<<6);
      break;
    default:
      j = j * k;
      break;
    }
  return j;
}

int
main (int argc, char **argv)
{
  int i;
  for (i = 0; i < sizeof(seq)/sizeof(seq[0]); i++)
    result = test_it (1, i);
  return 0;
}


Cheers,
Rahul


-----Original Message-----
From: Rahul Kharche 
Sent: 22 April 2010 11:24
To: Edmar Wienskoski
Cc: Steven Bosscher; Jan Hubicka; gcc@gcc.gnu.org; sdkteam-gnu
Subject: RE: branch probabilities on multiway branches

Thanks Edmar! I will try and work your patch into our GCC 4.4.1
port and get some results.

Cheers,
Rahul

Reply via email to