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 optimization/15354] New: wrong code regression on enum test


The following code compiles fine on g++ 3.3.3 and 3.2.2, but does not on 3.4.0 or 3.4.1 release 
20040502.  I'm not sure if this is related to bug 15069 or not.  The code example is below.  When 
compiled with 3.4, it executes the print statement.  This bug only occurs when optimization (-O1, -O2, 
or -O3) is enabled.

int printf(char *, ...);

enum my_enum_e {
  zero      = 0,
  one       = 1,
  two       = 2,
  three     = 3,
  four      = 4,
  five      = 5,
  six       = 6,
  seven     = 7,
  eight     = 8,
  nine      = 9,
  ten       = 10,
  eleven    = 11,
  twelve    = 12,
  thirteen  = 13,
  fourteen  = 14,
  fifteen   = 15,
  sixteen   = 16,
  seventeen = 17,
  eighteen  = 18,
  nineteen  = 19,
  numbers   = 20
};

my_enum_e ret_nineteen() {
  return nineteen;
}


int main() {
  my_enum_e enm = ret_nineteen();

  if (enm == one      || enm == two      || enm == three   ||
      enm == four     || enm == five     || enm == six     ||
      enm == seven    || enm == eight    || enm == nine    ||
      enm == ten      || enm == eleven   || enm == twelve  ||
      enm == thirteen || enm == fourteen || enm == fifteen ||
      enm == sixteen)
    printf("shouldn't print");

  return 0;
}


The generated assembly is the following.  The test at EIP 804844f isn't correct if I'm reading the code 
right.

08048434 <ret_nineteen()>:
 8048434:       55                      push   %ebp
 8048435:       89 e5                   mov    %esp,%ebp
 8048437:       b8 13 00 00 00          mov    $0x13,%eax
 804843c:       5d                      pop    %ebp
 804843d:       c3                      ret    

0804843e <main>:
 804843e:       55                      push   %ebp
 804843f:       89 e5                   mov    %esp,%ebp
 8048441:       83 ec 08                sub    $0x8,%esp
 8048444:       83 e4 f0                and    $0xfffffff0,%esp
 8048447:       83 ec 10                sub    $0x10,%esp
 804844a:       e8 e5 ff ff ff          call   8048434 <ret_nineteen()>
 804844f:       85 c0                   test   %eax,%eax
 8048451:       74 0c                   je     804845f <main+0x21>
 8048453:       c7 04 24 48 85 04 08    movl   $0x8048548,(%esp,1)
 804845a:       e8 f9 fe ff ff          call   8048358 <_init+0x38>
 804845f:       b8 00 00 00 00          mov    $0x0,%eax
 8048464:       c9                      leave  
 8048465:       c3                      ret    
 8048466:       90                      nop    
 8048467:       90                      nop

-- 
           Summary: wrong code regression on enum test
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: senor_fjord at yahoo dot com
                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=15354


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