------- Comment #6 from sliao at google dot com 2010-01-07 09:18 ------- For the trunk snapshot of 20100102, GCC 4.5.0 indeed removes most of the redundancy. However, -O1 and -Os still produce an extra instruction, while -O2 doesn't. Do we care about an extra instruction below? Thanks.
The instruction is marked as "redundant" below. GCC trunk's -Os: Disassembly of section .text: 00000000 <test>: 0: e59f3024 ldr r3, [pc, #36] ; 2c <test+0x2c> 4: e3a02000 mov r2, #0 8: e5832000 str r2, [r3] c: e59f301c ldr r3, [pc, #28] ; 30 <test+0x30> 10: e5932000 ldr r2, [r3] 14: e59f3018 ldr r3, [pc, #24] ; 34 <test+0x34> 18: e3520000 cmp r2, #0 1c: 13a02002 movne r2, #2 20: 03a02000 moveq r2, #0 ;redundant 24: e5c32000 strb r2, [r3] 28: e12fff1e bx lr ... GCC trunk's -O1: Disassembly of section .text: 00000000 <test>: 0: e3a02000 mov r2, #0 4: e59f3020 ldr r3, [pc, #32] ; 2c <test+0x2c> 8: e5832000 str r2, [r3] c: e59f301c ldr r3, [pc, #28] ; 30 <test+0x30> 10: e5932000 ldr r2, [r3] 14: e3520000 cmp r2, #0 18: 13a02002 movne r2, #2 1c: 03a02000 moveq r2, #0 ;redundant 20: e59f300c ldr r3, [pc, #12] ; 34 <test+0x34> 24: e5c32000 strb r2, [r3] 28: e12fff1e bx lr ... Below, GCC trunk's -O2 doesn't produce the redundant instruction. -O2: Disassembly of section .text: 00000000 <test>: 0: e59f3020 ldr r3, [pc, #32] ; 28 <test+0x28> 4: e59f2020 ldr r2, [pc, #32] ; 2c <test+0x2c> 8: e5933000 ldr r3, [r3] c: e3a01000 mov r1, #0 10: e3530000 cmp r3, #0 14: e5821000 str r1, [r2] 18: e59f2010 ldr r2, [pc, #16] ; 30 <test+0x30> 1c: 13a03002 movne r3, #2 20: e5c23000 strb r3, [r2] 24: e12fff1e bx lr ... -- sliao at google dot com changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jingyu at google dot com, | |dougkwan at google dot com, | |carrot at google dot com Status|RESOLVED |REOPENED Resolution|WONTFIX | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42494