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: [email protected]
ReportedBy: [email protected]
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.