Compile the attached test case with options -march=armv7-a -mthumb -Os, this code snippet
if (native) dlmalloc_walk_heap(heap_chunk_callback, (void *)&ctx); else dvmHeapSourceWalk(heap_chunk_callback, (void *)&ctx); is compiled to: cbz r5, .L2 ldr r0, .L4 // A mov r1, sp // B bl dlmalloc_walk_heap b .L1 .L2: ldr r0, .L4 // C mov r1, sp // D bl dvmHeapSourceWalk .L1: add sp, sp, #44 pop {r4, r5, pc} .L5: .align 2 .L4: .word heap_chunk_callback Note that instructions AB are equal to instructions CD, if we move the previous conditional branch after B, then CD can be removed. Option -O2 and target arm have the same problem. Which pass should do this optimization? pass_rtl_hoist? -- Summary: Hoist same instructions in different branches Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization 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=44374