c/321: gcc 2.95 x86 backend produces incorrect code with -O2
johan@virtutech.se
johan@virtutech.se
Wed Jun 14 07:36:00 GMT 2000
>Number: 321
>Category: c
>Synopsis: gcc 2.95 x86 backend produces incorrect code with -O2
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: wrong-code
>Submitter-Id: net
>Arrival-Date: Wed Jun 14 07:36:00 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Johan Högberg
>Release: unknown-1.0
>Organization:
>Environment:
matrix:~>gcc -v --save-temps -O2 -g extbl.c
Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -D__VTGNUC__ -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__OPTIMIZE__ -g -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di686 -Dpentiumpro -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ extbl.c extbl.i
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/../../../../i686-pc-linux-gnu/include
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/../../../../include/g++-3
End of omitted list.
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/cc1 extbl.i -quiet -dumpbase extbl.c -g -O2 -version -o extbl.s
GNU C version 2.95.2 19991024 (release) (i686-pc-linux-gnu) compiled by GNU C version 2.95.2 19991024 (release).
as -V -Qy -o extbl.o extbl.s
GNU assembler version 2.9.1 (i386-redhat-linux), using BFD version 2.9.1.0.24
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/local/lib/gcc-lib/i686-pc-linux-gnu/vt-2.95.2/crtbegin.o -L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/vt-2.95.2 -L/usr/local/lib extbl.o -lgcc -lc -lgcc /usr/local/lib/gcc-lib/i686-pc-linux-gnu/vt-2.95.2/crtend.o /usr/lib/crtn.o
matrix:~>uname -a
Linux matrix.hq.vtech 2.2.12-20 #1 Mon Sep 27 10:40:35 EDT 1999 i686 unknown
>Description:
The x86 back-end for gcc 2.95 produced incorrect code for
the following program when -O2 is used.
The same program works on Sparc/Solaris gcc 2.95 and on
x86/Linux gcc 2.91.66. It also works when -O1 or -O0 is
used.
typedef unsigned long long uint64;
unsigned int pars;
uint64 b[32];
uint64 *r = b;
void alpha_ep_extbl_i_eq_0()
{
unsigned int rb, ra, rc;
rb = (((unsigned int)(pars) >> 27)) & 0x1fUL;
ra = (((unsigned int)(pars) >> 5)) & 0x1fUL;
rc = (((unsigned int)(pars) >> 0)) & 0x1fUL;
{
uint64 temp = ((r[ra] >> ((r[rb] & 0x7) << 3)) & 0x00000000000000FFLL);
if (rc != 31)
r[rc] = temp;
}
}
int
main(void)
{
b[17] = 0x0000000000303882; /* rb */
b[2] = 0x534f4f4c494d000a; /* ra & rc */
/* ^^ should be extracted */
pars = 0x88000042; /* 17, 2, 2 coded */
alpha_ep_extbl_i_eq_0();
if (b[2] != 0x4d) {
printf("Buggy compiler!\n");
} else {
printf("Correct result!\n");
}
printf("result %llx\n", b[2]);
}
>How-To-Repeat:
Compile the program on an x86 machine with and without
-O2, different results are generated.
matrix:~>gcc -O2 -g extbl.c
matrix:~>./a.out
Buggy compiler!
result 4
matrix:~>gcc -O1 -g extbl.c
matrix:~>./a.out
Correct result!
result 4d
matrix:~>
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the Gcc-prs
mailing list