From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 308 invoked by alias); 29 Sep 2004 22:37:30 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 300 invoked by uid 48); 29 Sep 2004 22:37:28 -0000 Date: Wed, 29 Sep 2004 22:37:00 -0000 From: "m dot calderbank at iname dot com" To: gcc-bugs@gcc.gnu.org Message-ID: <20040929223724.17742.m.calderbank@iname.com> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug tree-optimization/17742] New: C Optimization error with -O1 and -O2 on i686 X-Bugzilla-Reason: CC X-SW-Source: 2004-09/txt/msg03711.txt.bz2 List-Id: 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