public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/17581] New: Long long arithmetic fails inside a switch/case statement when compiled with -O2
@ 2004-09-21  8:45 alottem at yahoo dot com
  2004-09-21  8:53 ` [Bug c++/17581] " schwab at suse dot de
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: alottem at yahoo dot com @ 2004-09-21  8:45 UTC (permalink / raw)
  To: gcc-bugs

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


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2004-10-30 23:06 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-09-21  8:45 [Bug c++/17581] New: Long long arithmetic fails inside a switch/case statement when compiled with -O2 alottem at yahoo dot com
2004-09-21  8:53 ` [Bug c++/17581] " schwab at suse dot de
2004-09-21  8:56 ` alottem at yahoo dot com
2004-09-21 12:22 ` alottem at yahoo dot com
2004-09-21 13:04 ` [Bug rtl-optimization/17581] [3.4 Regression] " pinskia at gcc dot gnu dot org
2004-10-29  2:12 ` pinskia at gcc dot gnu dot org
2004-10-30  0:57 ` cvs-commit at gcc dot gnu dot org
2004-10-30 18:03 ` cvs-commit at gcc dot gnu dot org
2004-10-30 18:12 ` pinskia at gcc dot gnu dot org
2004-10-30 23:06 ` pinskia at gcc dot gnu dot org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).