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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
      Known to work|                            |10.1.0, 9.1.0
      Known to fail|                            |8.5.0
             Status|NEW                         |RESOLVED

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
In GCC 9+:
ffs:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 0, uses_anonymous_args = 0
        movs    r3, r0
        movs    r0, #0
        push    {r4, lr}
        cmp     r3, r0
        beq     .L1
        movs    r1, #1
.L3:
        movs    r4, r3
        asrs    r4, r4, r0
        adds    r0, r0, #1
        tst     r4, r1
        beq     .L3
.L1:
        @ sp needed
        pop     {r4, pc}

So no move after inbetween the loop and the return.

GCC 5-8 produces:
ffs:
        movs    r3, #0
        cmp     r0, r3
        beq     .L2
        movs    r2, #1
.L3:
        movs    r1, r0
        asrs    r1, r1, r3
        adds    r3, r3, #1
        tst     r1, r2
        beq     .L3
.L2:
        movs    r0, r3
        @ sp needed
        bx      lr

So no extra move there either but GCC 9+ seems better, though using one extra
register.

Reply via email to