Compile the attached source code with options -Os -mthumb -march=armv5te -fno-strict-aliasing, Gcc generates:
iterate: push {lr} ldr r3, [r1] // C b .L5 .L4: ldr r3, [r3, #8] // D .L5: str r3, [r0] // A ldr r3, [r0] // B cmp r3, #0 beq .L3 ldr r2, [r3, #4] cmp r2, #0 beq .L4 .L3: str r3, [r0, #12] @ sp needed for prologue pop {pc} Pay attention to instructions marked as A and B. Instruction A store r3 to [r0] but insn B load it back to r3. The instruction A was originally put after instruction C and D. After register allocation, they were allocated to the same registers and looks exactly same. In pass csa, cleanup_cfg was called and it found the same instructions and moved them before instruction B. Now instruction B is obviously redundant. Is it OK to remove this kind of redundant code in pass dce? -- Summary: redundant memory load 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=40730