------- Additional Comments From schlie at comcast dot net 2004-11-11 03:55 ------- Subject: Re: 3.4.3 ~6x+ performance regression vs 3.3.1, constant trees not being computed.
> pinskia at gcc dot gnu dot org <[EMAIL PROTECTED]> wrote: > When I did 1 << 24 I got a warning (at least on the mainline on a cross to > avr) about 24 being greater > than the size of int so it was going to be 0. Again in real terms there is > something on here but I really > doubt it is a regression and you did not use -mint8 for the 3.3 build and not > for the 3.4 build. Yes, you're correct, (1 << 24) generates warnings: (not forcing -mmint8) main.c: In function `foo1': main.c:3: warning: left shift count >= width of type main.c: In function `foo2': main.c:12: warning: left shift count >= width of type main.c: At top level: main.c:21: warning: return type of 'main' is not `int' and produces the anticipated correct code, sorry for the confusion. --- However as reported with (1L << 24), it does not, nor should it yield different results, but it appears to product the expected code only if the same constant expression occurs in a simpler expression in the same basic block: ? File: main.lss: main.elf: file format elf32-avr Sections: Idx Name Size VMA LMA File off Algn 0 .data 00000000 00800100 0000011e 000001b2 2**0 CONTENTS, ALLOC, LOAD, DATA 1 .text 0000011e 00000000 00000000 00000094 2**0 CONTENTS, ALLOC, LOAD, READONLY, CODE 2 .bss 00000000 00800100 0000011e 000001b2 2**0 ALLOC 3 .noinit 00000000 00800100 00800100 000001b2 2**0 CONTENTS 4 .eeprom 00000000 00810000 00810000 000001b2 2**0 CONTENTS 5 .stab 000004c8 00000000 00000000 000001b4 2**2 CONTENTS, READONLY, DEBUGGING 6 .stabstr 0000044e 00000000 00000000 0000067c 2**0 CONTENTS, READONLY, DEBUGGING Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 46 00 jmp 0x8c 4: 0c 94 61 00 jmp 0xc2 8: 0c 94 61 00 jmp 0xc2 c: 0c 94 61 00 jmp 0xc2 10: 0c 94 61 00 jmp 0xc2 14: 0c 94 61 00 jmp 0xc2 18: 0c 94 61 00 jmp 0xc2 1c: 0c 94 61 00 jmp 0xc2 20: 0c 94 61 00 jmp 0xc2 24: 0c 94 61 00 jmp 0xc2 28: 0c 94 61 00 jmp 0xc2 2c: 0c 94 61 00 jmp 0xc2 30: 0c 94 61 00 jmp 0xc2 34: 0c 94 61 00 jmp 0xc2 38: 0c 94 61 00 jmp 0xc2 3c: 0c 94 61 00 jmp 0xc2 40: 0c 94 61 00 jmp 0xc2 44: 0c 94 61 00 jmp 0xc2 48: 0c 94 61 00 jmp 0xc2 4c: 0c 94 61 00 jmp 0xc2 50: 0c 94 61 00 jmp 0xc2 54: 0c 94 61 00 jmp 0xc2 58: 0c 94 61 00 jmp 0xc2 5c: 0c 94 61 00 jmp 0xc2 60: 0c 94 61 00 jmp 0xc2 64: 0c 94 61 00 jmp 0xc2 68: 0c 94 61 00 jmp 0xc2 6c: 0c 94 61 00 jmp 0xc2 70: 0c 94 61 00 jmp 0xc2 74: 0c 94 61 00 jmp 0xc2 78: 0c 94 61 00 jmp 0xc2 7c: 0c 94 61 00 jmp 0xc2 80: 0c 94 61 00 jmp 0xc2 84: 0c 94 61 00 jmp 0xc2 88: 0c 94 61 00 jmp 0xc2 0000008c <__ctors_end>: 8c: 11 24 eor r1, r1 8e: 1f be out 0x3f, r1 ; 63 90: cf ef ldi r28, 0xFF ; 255 92: d0 e1 ldi r29, 0x10 ; 16 94: de bf out 0x3e, r29 ; 62 96: cd bf out 0x3d, r28 ; 61 00000098 <__do_copy_data>: 98: 11 e0 ldi r17, 0x01 ; 1 9a: a0 e0 ldi r26, 0x00 ; 0 9c: b1 e0 ldi r27, 0x01 ; 1 9e: ee e1 ldi r30, 0x1E ; 30 a0: f1 e0 ldi r31, 0x01 ; 1 a2: 02 c0 rjmp .+4 ; 0xa8 000000a4 <.do_copy_data_loop>: a4: 05 90 lpm r0, Z+ a6: 0d 92 st X+, r0 000000a8 <.do_copy_data_start>: a8: a0 30 cpi r26, 0x00 ; 0 aa: b1 07 cpc r27, r17 ac: d9 f7 brne .-10 ; 0xa4 000000ae <__do_clear_bss>: ae: 11 e0 ldi r17, 0x01 ; 1 b0: a0 e0 ldi r26, 0x00 ; 0 b2: b1 e0 ldi r27, 0x01 ; 1 b4: 01 c0 rjmp .+2 ; 0xb8 000000b6 <.do_clear_bss_loop>: b6: 1d 92 st X+, r1 000000b8 <.do_clear_bss_start>: b8: a0 30 cpi r26, 0x00 ; 0 ba: b1 07 cpc r27, r17 bc: e1 f7 brne .-8 ; 0xb6 be: 0c 94 7c 00 jmp 0xf8 000000c2 <__bad_interrupt>: c2: 0c 94 00 00 jmp 0x0 000000c6 <foo1>: int foo1 ( 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 000000f2 <foo2>: int foo2 ( int a ){ a = (a & (1L << 23)); if (a & (1L << 23)) return 1; else return 2 ; } f2: 82 e0 ldi r24, 0x02 ; 2 f4: 90 e0 ldi r25, 0x00 ; 0 f6: 08 95 ret 000000f8 <main>: void main( void ){ f8: cd ef ldi r28, 0xFD ; 253 fa: d0 e1 ldi r29, 0x10 ; 16 fc: de bf out 0x3e, r29 ; 62 fe: cd bf out 0x3d, r28 ; 61 volatile int a; a = foo1 ( a ); 100: 89 81 ldd r24, Y+1 ; 0x01 102: 9a 81 ldd r25, Y+2 ; 0x02 104: 0e 94 63 00 call 0xc6 108: 89 83 std Y+1, r24 ; 0x01 10a: 9a 83 std Y+2, r25 ; 0x02 a = foo2 ( a ); 10c: 89 81 ldd r24, Y+1 ; 0x01 10e: 9a 81 ldd r25, Y+2 ; 0x02 110: 0e 94 79 00 call 0xf2 114: 89 83 std Y+1, r24 ; 0x01 116: 9a 83 std Y+2, r25 ; 0x02 118: 0c 94 8e 00 jmp 0x11c 0000011c <_exit>: 11c: ff cf rjmp .-2 ; 0x11c -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18424