This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
GCC Unrolling Simple Loop Generates Rubbish Code?
- From: Lei Ming <ming dot lei at oracle dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Tue, 19 Jul 2005 10:49:49 +0800
- Subject: GCC Unrolling Simple Loop Generates Rubbish Code?
Dear GCC Hackers,
This simple code:
int
main (void)
{
int s = 0;
int i;
for (i = 0; i < 100; i++)
s += i;
return 0;
}
After compiled with "-O3 -funroll-all-loops", will generate this piece of
assembly code for the loop:
movl $99, %eax
.L6:
subl $25, %eax <==
jns .L6
xorl %eax, %eax
leave
ret
I wonder what's the purpose of "subl $25, %eax"? If the compiler knows that
the whole loop is useless, since we don't really use the result, why not just
eliminate this loop and simply return zero? If it choose to execute the loop,
why it is the number 25 instead of other number? Why not 42? :-)
The logic here seems confusing to me, but I don't know much about GCC's
optimizing algorithms. Could someone kindly explain it to me?
I'm using GCC 3.2.3:
Reading specs from /usr/lib/gcc-lib/i386-asianux-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit
--host=i386-asianux-linux
Thread model: posix
gcc version 3.2.3 20030502
I've asked other people to test this with their different GCC version, and all
their GCC versions generate this kind of code, with maybe different numbers
than 25. Even GCC 4, it was said. I don't have GCC 4 currently.
Yesterday I asked this in #gcc on IRC, they suggested that this is a bug. But
I think I should ask it here before sending a stupid fake bug report :-)
So what will you say?
Best Regards,
Lei Ming