Bug#242318: gcc-3.3: gcc could generate better code for if(!p) return NULL;return p;
Package: gcc-3.3
Version: 1:3.3.3-6
Severity: wishlist
I saw some code that redundantly tests a malloc return for NULL, but
returns it either way. I wondered whether gcc would notice the
optimization. It turns out that it gets it right with -march=athlon, or
pentium3, but wrong with i386 or i486.
This C code:
#define NULL ((void *)0)
void *malloc( int );
void *foo(void)
{
void *p = malloc(10);
if( !p ) return NULL;
return p;
}
compiles to this assembly with
gcc gcc-redundancy.c -S -o /dev/tty -O3 -fomit-frame-poiner -march=i486
foo:
subl $24, %esp
pushl $10
call malloc
testl %eax, %eax
movl %eax, %ecx
sete %al
andl $255, %eax
decl %eax
andl %ecx, %eax
addl $28, %esp
ret
A better version is produced by
gcc gcc-redundancy.c -S -o /dev/tty -O3 -fomit-frame-poiner -march=athlon-xp
foo:
subl $12, %esp
movl $10, (%esp)
call malloc
addl $12, %esp
ret
Unless I'm missing something, there's no reason why that code wouldn't be
better for i486 too.
If the C is if( !p ) p=NULL; return p; gcc always gets it right.
happy hacking,
-- System Information:
Debian Release: 3.0
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.4.24-ck1
Locale: LANG=C, LC_CTYPE=C
Versions of packages gcc-3.3 depends on:
ii binutils 2.14.90.0.7-6 The GNU assembler, linker and bina
ii cpp-3.3 1:3.3.3-6 The GNU C preprocessor
ii gcc-3.3-base 1:3.3.3-6 The GNU Compiler Collection (base
ii libc6 2.3.2.ds1-11 GNU C Library: Shared libraries an
ii libgcc1 1:3.3.3-6 GCC support library
-- no debconf information
Reply to: