Compile the attached test case with options -Os, I can get the ideal result:
foo: cmp r0, #0 ldr r3, .L5 movne r2, #10 moveq r2, #20 str r2, [r3, #0] bx lr But when I changed the options to -O2, I got: foo: cmp r0, #0 ldrne r3, .L4 // A ldreq r3, .L4 // B movne r2, #10 moveq r2, #20 strne r2, [r3, #0] // C streq r2, [r3, #0] // D bx lr Instructions A/B/C/D should not executed conditionally since they do the same thing in either case. Similarly when I changed to options to -Os -fpic, I got: foo: ldr r3, .L5 ldr r2, .L5+4 .LPIC0: add r3, pc, r3 cmp r0, #0 ldrne r3, [r3, r2] // E ldreq r3, [r3, r2] // F movne r2, #10 moveq r2, #20 str r2, [r3, #0] bx lr Instructions E/F should not execute conditionally. -- Summary: wrong if conversion optimization Product: gcc Version: 4.5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: carrot at google dot com GCC build triplet: i686-linux GCC host triplet: i686-linux GCC target triplet: arm-eabi http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42496