[Bug tree-optimization/31272] New: gcc is being too clever
matt at 3am-software dot com
gcc-bugzilla@gcc.gnu.org
Mon Mar 19 22:42:00 GMT 2007
[This problem occurs in 4.1.2 and 4.1.3 as well]
Given the following source:
int
in_canforward(unsigned int in)
{
unsigned int net;
if ((in & ~0xffffff0f) == 0xf0 || (in & ~0xffffff0f) == 0xe0)
return 0;
if ((in & 0x80) == 0) {
net = in & 0xff;
if (net == 0 || net == 0x7f)
return 0;
}
return 1;
"cc1 -O2 -quiet" emit:
#NO_APP
.file "inc.c"
.text
.align 1
.globl in_canforward
.type in_canforward, @function
in_canforward:
.word 0x0
subl2 $4,%sp
movl 4(%ap),%r1
bicl3 $-241,%r1,%r0
cmpl %r0,$240
jeql .L2
cmpl %r0,$224
jeql .L2
bicb3 $127,%r1,%r0
jneq .L12
bicl2 $-256,%r1
jneq .L13
.L2:
clrl %r0
ret
.L12:
movl $1,%r0
ret
.L13:
cmpl %r1,$127
jeql .L14
xorb2 $1,%r0
movzbl %r0,%r0
ret
.L14:
movb $1,%r0
xorb2 $1,%r0
movzbl %r0,%r0
ret
.size in_canforward, .-in_canforward
.ident "GCC: (GNU) 4.3.0 20070319 (experimental)"
Notice the code at .L14? Why go through all extra that effort? Why not just
do clrl %r0 and ret or preferrably branch to .L2 which already does that? The
same argument goes for the xorb2/movzbl right before .L14. movl $1,%r0 and
ret or preferably branch to .L12 which already does that.
Now if you move .L13 before .L12 (so it can all fall through) and take the
mentioned branches, the almost-optimal version becomes:
in_canforward:
.word 0x0
subl2 $4,%sp
movl 4(%ap),%r1
bicl3 $-241,%r1,%r0
cmpl %r0,$240
jeql .L2
cmpl %r0,$224
jeql .L2
bicb3 $127,%r1,%r0
jneq .L12
bicl2 $-256,%r1
jneq .L13
.L2:
clrl %r0
ret
.L13:
cmpl %r1,$127
jeql .L2
.L12:
movl $1,%r0
ret
--
Summary: gcc is being too clever
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: matt at 3am-software dot com
GCC build triplet: x86_64--netbsd
GCC host triplet: x86_64--netbsd
GCC target triplet: vax--netbsdelf
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31272
More information about the Gcc-bugs
mailing list