[Bug rtl-optimization/17343] New: a dispatch table can be shortened for certain switch statements
kazu at cs dot umass dot edu
gcc-bugzilla@gcc.gnu.org
Tue Sep 7 08:43:00 GMT 2004
Consider:
void foo0(void);
void foo1(void);
void foo2(void);
void foo3(void);
void
foo (int a)
{
switch (a)
{
case 10:
case 11:
case 12:
case 13:
goto ddd;
case 14:
foo1();
break;
case 15:
foo2();
break;
case 16:
foo3();
break;
default:
ddd:
foo0();
break;
}
}
On i686-pc-linux-gnu with -O2 -fomit-frame-pointer, the above code
turns into:
foo:
movl 4(%esp), %eax
subl $10, %eax
cmpl $6, %eax
ja .L2
jmp *.L6(,%eax,4)
.section .rodata
.align 4
.align 4
.L6:
.long .L2
.long .L2
.long .L2
.long .L2
.long .L3
.long .L4
.long .L5
.text
.p2align 2,,3
.L2:
jmp foo0
.p2align 2,,3
.L5:
jmp foo3
.p2align 2,,3
.L3:
jmp foo1
.p2align 2,,3
.L4:
jmp foo2
Note that the function subtracts 10 from the argument and that the
first four entries of the dispatch table are the same as the default
case.
Therefore, if we subtracted 14, we could make the dispatch table
shorter, effectively treating cases 10 .. 13 as the default case.
--
Summary: a dispatch table can be shortened for certain switch
statements
Product: gcc
Version: 3.5.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: enhancement
Priority: P2
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: kazu at cs dot umass dot edu
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17343
More information about the Gcc-bugs
mailing list