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

            Bug ID: 71520
           Summary: Missing cross-jumping of switch cases
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

As mentioned in PR71373, for switch cases we have various issues.

One is that tree cross-jumping fails to handle bbs with labels, therefore
anything that is successfor of GIMPLE_SWITCH.

Another one is that the switchconv pass runs very early, before we could do any
cross-jumping, and therefore often decides to use inefficient table or bitmask
lowering, even when it could do better if it knew some cases can be
cross-jumped.

For the first issue, testcase is e.g.
void bar (int);

void
foo (int x)
{
  switch (x)
    {
    case 1:
    case 12:
    case 28:
    case 174:
      bar (1);
      bar (2);
      break;
    case 3:
    case 7:
    case 78:
    case 96:
    case 121:
    default:
      bar (3);
      bar (4);
      bar (5);
      bar (6);
      break;
    case 8:
    case 13:
    case 27:
    case 19:
    case 118:
      bar (3);
      bar (4);
      bar (5);
      bar (6);
      break;
    case 4:
      bar (7);
      break;
    }
}

Reply via email to