#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// g++ optimizer(-O2) generates wrong code on 32bit x86_64
//
// g++ 3.2.3 is ok
// g++ 3.4.6 & 4.1.1 are wrong
//
// platform Redhat AS4, x86_64
//
// g++ -g -O2 -m32 foo.cpp

typedef struct _GUID
{
        unsigned int Data1;
        unsigned short Data2;
        unsigned short Data3;
        unsigned char Data4[ 8 ];
} 
GUID;

inline bool IsGUIDNULL(const ::GUID& irGUID)
{
        return (
                (reinterpret_cast<const int*>(&irGUID))[0] == 0 &&
                (reinterpret_cast<const int*>(&irGUID))[1] == 0 &&
                (reinterpret_cast<const int*>(&irGUID))[2] == 0 &&
                (reinterpret_cast<const int*>(&irGUID))[3] == 0);
}

/* objdump result of the following bar() function

08048450 <_Z3barv>:
 8048450:       55                      push   %ebp
 8048451:       31 c0                   xor    %eax,%eax
 8048453:       89 e5                   mov    %esp,%ebp
 8048455:       83 ec 28                sub    $0x28,%esp
 8048458:       8b 55 ec                mov    0xffffffec(%ebp),%edx
 804845b:       c7 45 e8 00 00 00 00    movl   $0x0,0xffffffe8(%ebp)
 8048462:       66 c7 45 ec 00 00       movw   $0x0,0xffffffec(%ebp)
 8048468:       66 c7 45 ee 00 00       movw   $0x0,0xffffffee(%ebp)
 804846e:       c6 45 f0 00             movb   $0x0,0xfffffff0(%ebp)
 8048472:       c6 45 f1 00             movb   $0x0,0xfffffff1(%ebp)
 8048476:       85 d2                   test   %edx,%edx
 8048478:       c6 45 f2 00             movb   $0x0,0xfffffff2(%ebp)
 804847c:       c6 45 f3 00             movb   $0x0,0xfffffff3(%ebp)
 8048480:       c6 45 f4 00             movb   $0x0,0xfffffff4(%ebp)
 8048484:       c6 45 f5 00             movb   $0x0,0xfffffff5(%ebp)
 8048488:       c6 45 f6 00             movb   $0x0,0xfffffff6(%ebp)
 804848c:       c6 45 f7 00             movb   $0x0,0xfffffff7(%ebp)
 8048490:       75 10                   jne    80484a2 <_Z3barv+0x52>
 8048492:       8b 4d f0                mov    0xfffffff0(%ebp),%ecx
 8048495:       85 c9                   test   %ecx,%ecx
 8048497:       75 09                   jne    80484a2 <_Z3barv+0x52>
 8048499:       8b 55 f4                mov    0xfffffff4(%ebp),%edx
 804849c:       85 d2                   test   %edx,%edx
 804849e:       75 02                   jne    80484a2 <_Z3barv+0x52>
 80484a0:       b0 01                   mov    $0x1,%al
 80484a2:       85 c0                   test   %eax,%eax
 80484a4:       74 02                   je     80484a8 <_Z3barv+0x58>
 80484a6:       c9                      leave
 80484a7:       c3                      ret
 80484a8:       c7 44 24 04 bc 85 04    movl   $0x80485bc,0x4(%esp)
 80484af:       08
 80484b0:       a1 5c 97 04 08          mov    0x804975c,%eax
 80484b5:       89 04 24                mov    %eax,(%esp)
 80484b8:       e8 af fe ff ff          call   804836c <[EMAIL PROTECTED]>
 80484bd:       c9                      leave
 80484be:       c3                      ret
 80484bf:       90                      nop
*/

void bar()
{
        GUID guid;

        guid.Data1 = 0;
        guid.Data2 = 0;
        guid.Data3 = 0;
        guid.Data4[0] = 0;
        guid.Data4[1] = 0;
        guid.Data4[2] = 0;
        guid.Data4[3] = 0;
        guid.Data4[4] = 0;
        guid.Data4[5] = 0;
        guid.Data4[6] = 0;
        guid.Data4[7] = 0;

        if (!IsGUIDNULL(guid))
        {
                // Fails here
                fprintf(stderr, "test failed\n");
        }
}

int main(int argc, char*argv[])
{
        int i=0;

        bar();

        return i;
}


-- 
           Summary: g++ optimizer(-O2) generates wrong code in 32bit mode on
                    x86_64
           Product: gcc
           Version: 3.4.6
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: myan at microstrategy dot com


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

Reply via email to