http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46925

           Summary: Can't optimize degenerate table jumps
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: amona...@gcc.gnu.org


For this testcase: http://gcc.gnu.org/bugzilla/attachment.cgi?id=22696
GCC converts the switch to a table jump which is not optimized.

-O2 assembly (4.6 trunk r167528):
foo:
.LFB0:
        .cfi_startproc
        xorl    %eax, %eax
        cmpl    $4, %edi
        ja      .L2
        mov     %edi, %edi
        jmp     *.L8(,%rdi,8)
        .section        .rodata
        .align 8
        .align 4
.L8:
        .quad   .L6
        .quad   .L6
        .quad   .L6
        .quad   .L6
        .quad   .L7
        .text
        .p2align 4,,10
        .p2align 3
.L6:
        movq    (%rsi), %rax
        ret
        .p2align 4,,10
        .p2align 3
.L7:
        movq    (%rsi), %rax
.L2:
        rep
        ret

-Os assembly:
foo:
.LFB0:
        .cfi_startproc
        xorl    %eax, %eax
        cmpl    $4, %edi
        ja      .L2
        mov     %edi, %edi
        movq    (%rsi), %rax
        jmp     *.L8(,%rdi,8)
        .section        .rodata
        .align 8
        .align 4
.L8:
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .quad   .L2
        .text
.L2:
        ret

It would be nice if GCC could optimize out the table jump at least at -Os.
Does not seem to be a regression, gcc-3.4 and later generate similar code.

Reply via email to