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

            Bug ID: 97736
           Summary: [9/10 Regression] switch codegen
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ncm at cantrip dot org
  Target Milestone: ---

In Gcc 8 and previous, the following code 

  bool is_vowel(char c) {
    switch (c)
    case'a':case'e':case'i':case'o':case'u':
      return true;
    return false;
  }

compiled with -O2 or better, for numerous x86-64 targets,
resolves to a bitwise flag check, e.g.

        lea     ecx, [rdi-97]
        xor     eax, eax
        cmp     cl, 20
        ja      .L1
        mov     eax, 1
        sal     rax, cl
        test    eax, 1065233
        setne   al
  .L1:
        ret

Starting in gcc-9, this optimization is not performed 
anymore at -O2 for many common targets (e.g. -march=skylake),
and we get

        sub     edi, 97
        cmp     dil, 20
        ja      .L2
        movzx   edi, dil
        jmp     [QWORD PTR .L4[0+rdi*8]]
  .L4:
        .quad   .L5
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L5
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L5
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L5
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L5
  .L2:
        mov     eax, 0
        ret
  .L5:
        mov     eax, 1
        ret

same as with -O0 or -O1.

Reply via email to