Tamar Christina <tamar.christ...@arm.com> writes:
> Hi Richard,
>
> I have updated the patch, changelog is the same.
>
> bootstrapped and regtested on aarch64-none-linux-gnu and no issues.
>
> OK for gcc 9 and 8?
>
> Thanks,
> Tamar
>
> [...]
> diff --git a/gcc/config/aarch64/aarch64-simd.md 
> b/gcc/config/aarch64/aarch64-simd.md
> index 
> 89aaf8c018e3340dd2d53fc2a6538d3d1220b103..16abe70be0ad90d3befdc5c4dfdb1471f2c98c58
>  100644
> --- a/gcc/config/aarch64/aarch64-simd.md
> +++ b/gcc/config/aarch64/aarch64-simd.md
> @@ -5330,6 +5330,26 @@ (define_expand "mov<mode>"
>        if (GET_CODE (operands[0]) != REG)
>       operands[1] = force_reg (<MODE>mode, operands[1]);
>      }
> +
> +  /* If we have a paradoxical subreg trying to write to <MODE> from and the
> +     registers don't overlap then we need to break it apart.  What it's 
> trying
> +     to do is give two kind of information at the same time.  It's trying to
> +     convey liveness information by saying that the entire register will be
> +     written to eventually, but it also only wants to write a single part of 
> the
> +     register.  Hence the paradoxical subreg.
> +
> +     Instead of allowing this we will split the two concerns.  The liveness
> +     information will be conveyed using a clobber and then we break apart the
> +     paradoxical subreg into just a normal write of the part that it wanted 
> to
> +     write originally.  */
> +
> +  if (REG_P(operands[0]) && paradoxical_subreg_p (operands[1]))

Sorry for the nit, but: space between REG_P and (

OK for backports with that change, once the bug is fixed in master.

Thanks,
Richard

> +    {
> +      if (!reg_overlap_mentioned_p (operands[0], operands[1]))
> +     emit_clobber (operands[0]);
> +      operands[1] = SUBREG_REG (operands[1]);
> +      operands[0] = gen_lowpart (GET_MODE (operands[1]), operands[0]);
> +    }
>  })
 
 

Reply via email to