https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40361

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
So the cross jumping opportunity since at least 5.4 even with a conditional
return.

        ldr     r3, .L8
        stmfd   sp!, {r4, lr}
        ldr     r3, [r3]
        ldr     r4, .L8+4
        cmp     r3, #0
        bge     .L2
        bl      bar1
        ldr     r3, [r4]
        cmp     r3, #0
        ldmgefd sp!, {r4, pc}
.L3:
        mov     r3, #0
        str     r3, [r4]
        ldmfd   sp!, {r4, pc}
.L2:
        bl      bar2
        ldr     r3, [r4]
        cmp     r3, #0
        blt     .L3
        ldmfd   sp!, {r4, pc}

The trunk produces this:
        push    {r4, lr}
        ldr     r4, .L9
        ldr     r3, [r4]
        cmp     r3, #0
        bge     .L2
        bl      bar1
.L8:
        ldr     r3, [r4, #4]
        cmp     r3, #0
        movlt   r3, #0
        strlt   r3, [r4, #4]
        pop     {r4, pc}
.L2:
        bl      bar2
        b       .L8

Which is even more cross jumped and note push and stmfd are the same here just
written differently.

Reply via email to