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.