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