3.4.3 generates code which may be ~6x+ slower and larger than 3.3.1 @ -0s
as it apparently no longer evaluates constant expression trees in anything
other than simple expressions for some reason, which may result in serious
performance and code size regressions, which should really be fixed if possible.

// 000000c6 <foo>:
int foo ( int a ){
        if (a & (1L << 23))
//  c6: aa 27           eor     r26, r26
//  c8: 97 fd           sbrc    r25, 7
//  ca: a0 95           com     r26
//  cc: ba 2f           mov     r27, r26
//  ce: 27 e1           ldi     r18, 0x17       ; 23
//  d0: b6 95           lsr     r27
//  d2: a7 95           ror     r26
//  d4: 97 95           ror     r25
//  d6: 87 95           ror     r24
//  d8: 2a 95           dec     r18
//  da: d1 f7           brne    .-12            ; 0xd0
//  dc: 81 70           andi    r24, 0x01       ; 1
//  de: 90 70           andi    r25, 0x00       ; 0
//  e0: 89 2b           or      r24, r25
//  e2: 19 f0           breq    .+6             ; 0xea
                return 1; 
//  e4: 81 e0           ldi     r24, 0x01       ; 1
//  e6: 90 e0           ldi     r25, 0x00       ; 0
//  e8: 08 95           ret
          else
                return 2 ;
//  ea: 82 e0           ldi     r24, 0x02       ; 2
//  ec: 90 e0           ldi     r25, 0x00       ; 0
}
//  ee: 08 95           ret
//  f0: 08 95           ret
// where the second return is odd as well?

vs GCC 3.3.1 @ -0s

// 000000c6 <foo>:
int foo2 ( int a ){
        if (a & (1L << 23))
                return 1; 
          else
                return 2 ;
}
//  c6: 82 e0           ldi     r24, 0x02       ; 2
//  c8: 90 e0           ldi     r25, 0x00       ; 0
//  ca: 08 95           ret

(where for referance int targeted to avr is 16-bits wide,
 but the above problem is not likely target sensitive.)

-- 
           Summary: 3.4.3 ~6x+ performance regression vs 3.3.1, constant
                    trees not being computed.
           Product: gcc
           Version: 3.4.3
            Status: UNCONFIRMED
          Severity: critical
          Priority: P1
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: schlie at comcast dot net
                CC: dmixm at marine dot febras dot ru,ericw at evcohs dot
                    com,gcc-bugs at gcc dot gnu dot org
 GCC build triplet: any
  GCC host triplet: any
GCC target triplet: avr-unknown-none


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

Reply via email to