This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/17581] New: Long long arithmetic fails inside a switch/case statement when compiled with -O2


Inside a case statement, the following code gives an incorrect result:
        case 21:
                ctl_bitvec |= 1;
                ctl_bitvec |= 2;
                ctl_bitvec |= 8;
                break;

By the end of the calculation, ctl_bitvec contains 8 instead of 0xb.

This is a complete listing that exhibits the problem:

--------------------------------------- cut here --------------------------
#include <stdio.h>

void
f(long unsigned *x1)
{
	int stack_ctl;
	unsigned long long ctl_bitvec;

	stack_ctl = *x1;
	ctl_bitvec = 0;

	switch(stack_ctl) {
	case 8:
		ctl_bitvec |= 1;
		ctl_bitvec |= 2;
		break;
	case 12:
		ctl_bitvec |= 1;
		ctl_bitvec |= 2;
		ctl_bitvec |= 0x10;
		break;
	case 15:
		ctl_bitvec |= 2;
		ctl_bitvec |= 0x10;
		break;
	case 16:
		ctl_bitvec |= 1;
		ctl_bitvec |= 0x20;
		ctl_bitvec |= 8;
		break;
	case 20:
		ctl_bitvec |= 1;
		ctl_bitvec |= 8;
		break;
	case 21:
		ctl_bitvec |= 1;
		ctl_bitvec |= 2;
		ctl_bitvec |= 8;
		break;
	case 22:
		ctl_bitvec |= 8;
		break;
	case 30:
		ctl_bitvec |= 0x40;
		break;
	default:
		break;
}

	printf("%x\n", ctl_bitvec);
	(*x1) |= ((ctl_bitvec & 7) << 0);
}


main() {
	long unsigned i = 21;
	f(&i);
}

--------------------------------------- cut here --------------------------

This is the a sample compile and run:

% make && make run
/usr/intel/pkgs/gcc/3.4/bin/g++ -O2 -march=pentium3 test.c -o test_o2
/usr/intel/pkgs/gcc/3.4/bin/g++ -O -march=pentium3 test.c -o test_o
./test_o2
8
./test_o
b

% /usr/intel/pkgs/gcc/3.4/bin/g++ -v
Reading specs 
from /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/specs
Configured with: ../gcc-3.4.0/configure --prefix=/usr/intel/pkgs/gcc/3.4 --with-
gnu-as --with-as=/usr/intel/pkgs/gcc/3.4/bin/gas --with-gnu-ld --with-
ld=/usr/intel/pkgs/gcc/3.4/bin/gld --enable-shared
Thread model: posix
gcc version 3.4.0

% /usr/intel/pkgs/gcc/3.4/bin/g++ -v -save-temps -O2 -march=pentium3 test.c -o 
test_o2
Reading specs 
from /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/specs
Configured with: ../gcc-3.4.0/configure --prefix=/usr/intel/pkgs/gcc/3.4 --with-
gnu-as --with-as=/usr/intel/pkgs/gcc/3.4/bin/gas --with-gnu-ld --with-
ld=/usr/intel/pkgs/gcc/3.4/bin/gld --enable-shared
Thread model: posix
gcc version 3.4.0
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../libexec/gcc/i686-pc-linux-
gnu/3.4.0/cc1plus -E -quiet -v -
iprefix /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-
linux-gnu/3.4.0/ -D_GNU_SOURCE test.c -march=pentium3 -O2 -o test.ii
ignoring nonexistent 
directory "/a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-
linux-gnu/3.4.0/../../../../i686-pc-linux-gnu/include"
ignoring duplicate directory "/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0"
ignoring duplicate directory "/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0/i686-pc-linux-gnu"
ignoring duplicate directory "/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0/backward"
ignoring duplicate directory "/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/include"
ignoring nonexistent directory "/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0/i686-pc-linux-gnu
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../include/c++/3.4.0/backward
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/include
 /usr/local/include
 /usr/intel/pkgs/gcc/3.4/include
 /usr/include
End of search list.
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../libexec/gcc/i686-pc-linux-
gnu/3.4.0/cc1plus -fpreprocessed test.ii -quiet -dumpbase test.c -
march=pentium3 -auxbase test -O2 -version -o test.s
GNU C++ version 3.4.0 (i686-pc-linux-gnu)
        compiled by GNU C version 3.4.0.
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128512
 /usr/intel/pkgs/gcc/3.4/bin/gas -V -Qy -o test.o test.s
GNU assembler version 2.14 (i686-pc-linux-gnu) using BFD version 2.14 20030612
 /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../libexec/gcc/i686-pc-linux-
gnu/3.4.0/collect2 -rpath=/usr/intel/pkgs/gcc/3.4/lib --eh-frame-hdr -m 
elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o 
test_o2 /usr/lib/crt1.o /usr/lib/crti.o /a/nfs/iil/itools/i386_linux24/pkgs/gcc/
3.4/bin/../lib/gcc/i686-pc-linux-gnu/3.4.0/crtbegin.o -
L/a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0 -L/a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc -
L/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-gnu/3.4.0 -
L/a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/../../../../i686-pc-linux-gnu/lib -
L/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-gnu/3.4.0/../../../../i686-pc-
linux-gnu/lib -L/a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-
pc-linux-gnu/3.4.0/../../.. -L/usr/intel/pkgs/gcc/3.4/lib/gcc/i686-pc-linux-
gnu/3.4.0/../../.. test.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -
lgcc /a/nfs/iil/itools/i386_linux24/pkgs/gcc/3.4/bin/../lib/gcc/i686-pc-linux-
gnu/3.4.0/crtend.o /usr/lib/crtn.o

-- 
           Summary: Long long arithmetic fails inside a switch/case
                    statement when compiled with -O2
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: alottem at yahoo dot com
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17581


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]