http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47004
Summary: missed optimization in comparison
Product: gcc
Version: 4.5.4
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: tree-optimization
AssignedTo: [email protected]
ReportedBy: [email protected]
Created attachment 22811
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22811
Preprocessed source to reproduce
The attached C test case shows missed optimization, where lenzero could be
optimized to generate the same code as lenzero2. This pattern is very common in
Ada, where the 'Length attribute for arrays expands to the same code as that
for len. As this is all simple integer code without any aliasing issues, I have
some hope that GCC can do better here.
Regards,
-Geert
cat lenzero.c && gcc -O3 -fomit-frame-pointer -save-temps -c lenzero.c && otool
-tv lenzero.o
int len(int f, int l) {
return l < f ? 0 : l - f + 1;
}
int lenzero(int f, int l) {
return len(f, l) == 0;
}
int lenzero2(int f, int l) {
return l < f;
}
lenzero.o:
(__TEXT,__text) section
_len:
0000000000000000 xorl %eax,%eax
0000000000000002 cmpl %edi,%esi
0000000000000004 jl 0x0000000b
0000000000000006 subl %edi,%esi
0000000000000008 leal 0x01(%rsi),%eax
000000000000000b repz/ret
000000000000000d nop
000000000000000e nop
_lenzero:
0000000000000010 cmpl %esi,%edi
0000000000000012 movl $0x00000001,%eax
0000000000000017 jg 0x00000023
0000000000000019 subl %edi,%esi
000000000000001b xorl %eax,%eax
000000000000001d cmpl $0xff,%esi
0000000000000020 sete %al
0000000000000023 repz/ret
0000000000000025 nop
0000000000000026 nopw %cs:0x00000000(%rax,%rax)
_lenzero2:
0000000000000030 xorl %eax,%eax
0000000000000032 cmpl %edi,%esi
0000000000000034 setl %al
0000000000000037 ret