Tamar Christina <[email protected]> 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]);
> + }
> })