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]); > + } > })