This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
Optimization bug in current GCC CVS mainline
- To: libc-alpha at sources dot redhat dot com
- Subject: Optimization bug in current GCC CVS mainline
- From: Andreas Jaeger <aj at suse dot de>
- Date: 06 May 2001 13:34:57 +0200
- Cc: gcc-bugs at gcc dot gnu dot org, Jan Hubicka <jh at suse dot cz>
The following small program fails with current gcc 3.1 from CVS if the
i486 specific <bits/string.h> header is used with:
$ /opt/gcc-3.1-devel/bin/gcc -Wall strpbrk-test.c -O3 -g -march=pentiumpro -mcpu=i686;./a.out
strpbrk flunked test 10
I'm appending some more information and the preprocessed sources.
Removing the first or last strcpy problem leads to a working program,
therefore it looks like gcc optimizes the second strcpy away :-(.
Any help is appreciated,
Andreas
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define _GNU_SOURCE
#define __USE_STRING_INLINES 1
#include <stdio.h>
#include <string.h>
char one[50];
const char *it = "<UNSET>"; /* Routine name for message routines. */
size_t errors = 0;
static void
check (int thing, int number)
{
if (!thing)
{
printf("%s flunked test %d\n", it, number);
++errors;
}
}
static void
test_strpbrk (void)
{
it = "strpbrk";
(void) strcpy(one, "abcabdea");
(void) strcpy(one, "");
check(strpbrk(one, "bc") == NULL, 10); /* Empty string. */
(void) strcpy(one, "");
}
int
main (void)
{
test_strpbrk ();
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ /opt/gcc-3.1-devel/bin/gcc -Wall strpbrk-test.c -O3 -g -march=pentiumpro -mcpu=i686 -save-temps -v
Reading specs from /opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/specs
Configured with: /cvs/gcc/configure --prefix=/opt/gcc-3.1-devel --enable-shared --enable-threads=posix --with-gnu-as --with-gnu-ld --disable-nls --with-system-zlib --enable-languages=c,objc,c++,f77,java
Thread model: posix
gcc version 3.1 20010505 (experimental)
/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/cpp0 -lang-c -v -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem=posix -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -Wall -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ -D__tune_i686__ -D__tune_pentiumpro__ strpbrk-test.c strpbrk-test.i
GNU CPP version 3.1 20010505 (experimental) (cpplib) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/include
/opt/gcc-3.1-devel/i686-pc-linux-gnu/include
/usr/include
End of search list.
/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/cc1 -fpreprocessed strpbrk-test.i -quiet -dumpbase strpbrk-test.c -march=pentiumpro -mcpu=i686 -g -O3 -Wall -version -o strpbrk-test.s
GNU CPP version 3.1 20010505 (experimental) (cpplib) (i386 Linux/ELF)
GNU C version 3.1 20010505 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 3.1 20010505 (experimental).
as -V -Qy -o strpbrk-test.o strpbrk-test.s
GNU assembler version 2.11.90 (i686-pc-linux-gnu) using BFD version 2.11.90
/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/crtbegin.o -L/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1 -L/opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/../../.. strpbrk-test.o -lgcc -lc -lgcc /opt/gcc-3.1-devel/lib/gcc-lib/i686-pc-linux-gnu/3.1/crtend.o /usr/lib/crtn.o
strpbrk-test.i.gz
--
Andreas Jaeger
SuSE Labs aj@suse.de
private aj@arthur.inka.de
http://www.suse.de/~aj