Kyrill Tkachov wrote:
> On 25/04/16 20:21, Wilco Dijkstra wrote:
> > The GCC switch expansion is awful, so
> > even with a good indirect predictor it is better to use conditional
> > branches.
> 
> In what way is it awful? If there's something we can do better at
> can you file a bug report with a testcase so that we can work on
> improving it rather than tweaking a heuristic in the backend.

In every way :-( 

Try this simple example and see whether you agree this is terrible,
especially on targets that don't use PC-relative tables...

int i;
int func(int a)
{
  switch(a)
  {
    case 0:   i = 20; break;
    case 1:   i = 50; break;
    case 2:   i = 29; break;
    case 3:   i = 20; break;
    case 4:   i = 50; break;
    case 5:   i = 29; break;
    case 6:   i = 20; break;
    case 7:   i = 50; break;
    case 8:   i = 29; break;
    case 9:   i = 79; break;
    case 110: i = 27; break;
    default:  i = 77; break;
  }
  return i;
}

See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70861.

It's also disappointing this doesn't get turned into:

return i = (unsigned)a <= 110 ? table[a] : 77;

Wilco

Reply via email to