This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/17742] New: C Optimization error with -O1 and -O2 on i686
- From: "m dot calderbank at iname dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Sep 2004 22:37:28 -0000
- Subject: [Bug tree-optimization/17742] New: C Optimization error with -O1 and -O2 on i686
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The following program compiles incorrectly on i686 using the latest CVS code and
optimization level -O1 or -O2. But -O3 is OK, as is -fno-ivopts.
I am aware that bug #17474 concerns -fno-ivopts but lack the knowledge to
determine if this is a related problem.
Compiled with gcc -O1 -save-temps test.c:
--- Begin test.c ---
#define advance(f) do { ++pos; if ((f) && pos >= argc) return(2); } while (0)
int pos;
int argc; char **argv;
int term();
int
main(int margc, char **margv)
{
argc = margc; argv = margv;
pos = 1;
return term();
}
int
term()
{
int value;
if (pos >= argc) return (2);
if (argv[pos][0] == '!' && argv[pos][1] == '\0')
{
value = 0;
while (pos < argc && argv[pos][0] == '!' && argv[pos][1] == '\0')
{
advance (1);
value = 1 - value;
}
return (value ? !term() : term());
}
return (0);
}
--- End test.c ---
Output of gcc -v:
Reading specs from
/home/mark/tarballs/gcc-cvs/gcc-build/usr/lib/gcc/i686-pc-linux-gnu/4.0.0/specs
Configured with: ../gcc/configure
--prefix=/home/mark/tarballs/gcc-cvs/gcc-build/usr
--libexecdir=/home/mark/tarballs/gcc-cvs/gcc-build/usr/lib --enable-shared
--enable-languages=c
Thread model: posix
gcc version 4.0.0 20040929 (experimental)
The file test.c is cut down from the coreutils program of the same name, which
also suffers from this bug. When supplied with three or more arguments of which
at least the first two are exclamation marks, the program enters an infinite
loop. e.g.
./a.out ! ! foo
I've included a portion of my assembly output below to point out what I think is
going wrong. Line (1) earmarks register %ecx for the 'value' variable. Line (2)
is supposed to be performing ++pos, but in fact performs "pos = original-pos +
value + 1". Lines (3) flip "value" between 0 and 1. Of course this breaks after
two iterations, and the loop never exits.
movl $0, %ecx ; (1)
leal 0(,%eax,4), %ebx
.L13:
leal 1(%edi,%ecx), %eax ; (2)
movl %eax, pos
cmpl %eax, -16(%ebp)
jg .L14
movl $2, %eax
jmp .L8
.L14:
movl $1, %eax ; (3)
subl %ecx, %eax ; (3)
movl %eax, %edx ; (3)
movl %eax, %ecx ; (3)
leal (%ebx,%eax,4), %eax
movl (%eax,%esi), %eax
cmpb $33, (%eax)
jne .L16
cmpb $0, 1(%eax)
je .L13
--
Summary: C Optimization error with -O1 and -O2 on i686
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: m dot calderbank at iname dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17742