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

Wilco <wilco at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |wilco at gcc dot gnu.org
      Known to work|                            |6.3.1
         Resolution|---                         |FIXED
      Known to fail|                            |4.8.2, 5.4.1

--- Comment #3 from Wilco <wilco at gcc dot gnu.org> ---
(In reply to Mans Rullgard from comment #0)
> Created attachment 27932 [details]
> Test case
> 
> Compiling the attached code for ARM results in redundant instructions even
> at -O3 optimisation.  Note this sequence (interleaved with other
> instructions):
> 
>         ldrh    r3, [r0]        @ unaligned
>         and     r3, r3, #2
>         uxth    r3, r3
>         cmp     r3, #0
>         beq     .L2
> 
> The UXTH is clearly redundant since no more than 16 bits can be set by LDRH.
> Once this is removed, the CMP can be folded with the AND as ANDS.
> 
> Interestingly, this badness only happens with -march=armv6 or higher.  If
> the target is v5, sane code is generated.
> 
> This is a regression in the 4.7 and 4.8 branches.  4.6 and earlier behave
> properly.

GCC6.3 produces with -O3:

        ldrh    r0, [r1]
        ands    r0, r0, #2
        it      ne
        movne   r0, #0
        beq     .L8

Closing as GCC4.8 isn't active.

Reply via email to