From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9947 invoked by alias); 5 Jan 2004 03:26:02 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 9940 invoked by alias); 5 Jan 2004 03:26:01 -0000 Date: Mon, 05 Jan 2004 03:26:00 -0000 From: "gcc-bugzilla at gcc dot gnu dot org" To: gcc-bugs@gcc.gnu.org Message-ID: <20040105032552.13566.snyder@fnal.gov> Reply-To: gcc-bugzilla@gcc.gnu.org Subject: [Bug c++/13566] New: bad code with -O3 -fno-strict-aliasing X-Bugzilla-Reason: CC X-SW-Source: 2004-01/txt/msg00345.txt.bz2 List-Id: I've run into a case where bad code is being generated on ia86 when i use -O2 -fno-strict-aliasing. The test case is below; i apologize that i haven't been able to reduce it much further. I expect that this program will print `2' when executed, and it does in fact do so when compiled without optimization, or without -fno-strict-aliasing: $ g++ -o x x.cc $ ./x 2 $ g++ -O2 -o x x.cc $ ./x 2 $ However, when -O2 is combined with -fno-strict-aliasing, it prints `1': $ g++ -O2 -fno-strict-aliasing -o x x.cc $ ./x 1 $ Here is the generated code for the add_bool_list() function, when compiled with -O2 -fno-strict-aliasing: ------------------------------------- .globl _Z13add_bool_listv .type _Z13add_bool_listv, @function _Z13add_bool_listv: .LFB26: .L6: .L18: .L23: .L26: pushl %ebp .LCFI0: xorl %eax, %eax movl %esp, %ebp .LCFI1: subl $200, %esp .LCFI2: movl %eax, -188(%ebp) xorl %eax, %eax xorl %edx, %edx movl %eax, -168(%ebp) xorl %eax, %eax xorl %ecx, %ecx movl %eax, -164(%ebp) xorl %eax, %eax movl %eax, -152(%ebp) xorl %eax, %eax movl %edx, -132(%ebp) xorl %edx, %edx testl %edx, %edx movl %eax, -148(%ebp) leal -192(%ebp), %eax movl $0, -72(%ebp) movl $0, -68(%ebp) movl $0, -56(%ebp) movl $0, -52(%ebp) movl $0, -40(%ebp) movl $0, -36(%ebp) movl $0, -24(%ebp) movl $0, -20(%ebp) movl %ecx, -192(%ebp) movl %eax, -136(%ebp) movl %eax, -104(%ebp) movl $0, -100(%ebp) jle .L36 .L45: orl $1, (%eax) ; This can't be right! .L37: incl -100(%ebp) incl %edx cmpl $1, %edx jle .L43 movl -192(%ebp), %eax leave ret .p2align 4,,7 .L43: testl %edx, %edx movl -104(%ebp), %eax jg .L45 .L36: andl $-2, (%eax) jmp .L37 ------------------------------------- [Besides the codegen problem being reported here, it looks like there is useless code which the compiler is not removing.] Environment: System: Linux karma 2.6.0 #9 Sun Dec 28 19:12:01 EST 2003 i686 i686 i386 GNU/Linux Architecture: i686 host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: ../gcc/configure --prefix=/usr/local/gcc --enable-threads=posix --enable-long-long --enable-languages=c,c++,f77 How-To-Repeat: Compile the below with -O2 -fno-strict-aliasing. ---------------------------------------------------------- extern "C" int printf (const char*, ...); extern "C" void abort(); struct xbasic_string { ~xbasic_string() {} }; class foo{}; struct _Bit_iterator_base : public foo { unsigned long * _M_p; unsigned int _M_offset; }; struct Bit_iterator : public _Bit_iterator_base { }; inline Bit_iterator copy (Bit_iterator result) { for (int n = 0; n < 2; ++n) { if (n>0) *result._M_p |= (1<_M_start._M_p = &bb; copya(); } }; static int foofoo(int, Bit_iterator first = Bit_iterator(), Bit_iterator last = Bit_iterator(), Bit_iterator a = Bit_iterator(), Bit_iterator b = Bit_iterator(), Bit_iterator c = Bit_iterator(), Bit_iterator d = Bit_iterator() ) { unsigned long bb = 0; Bit_iterator i; i._M_p = &bb; i._M_offset = 0; copy(i); return bb; } struct bvalue_type { xbasic_string first; BoolList second; bvalue_type(const BoolList& b=BoolList()) : second(b) {} }; struct biterator { biterator() {} biterator(const biterator& __it) {} }; inline bool xxx (biterator = biterator()) { return true; } inline biterator insertfoo(biterator position=biterator(), const xbasic_string& s = xbasic_string()) { return biterator(); } inline biterator insertbar(biterator position=biterator(), const bvalue_type& __x=bvalue_type()) { return biterator (); } int add_bool_list() { { biterator i; i = insertfoo(); if (xxx ()) insertbar(); } return foofoo(1); } int main( ) { int b = add_bool_list(); printf ("%d\n", b); } ---------------------------------------------------------- ------- Additional Comments From snyder at fnal dot gov 2004-01-05 03:25 ------- Fix: -- Summary: bad code with -O3 -fno-strict-aliasing Product: gcc Version: 3.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: snyder at fnal dot gov CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13566