RFC: ARM MVE and Neon auto-vectorization
Andre Vieira (lists)
andre.simoesdiasvieira@arm.com
Wed Dec 9 14:35:44 GMT 2020
On 08/12/2020 13:50, Christophe Lyon via Gcc-patches wrote:
> Hi,
>
>
> My 'vand' patch changes the definition of VDQ so that the relevant
> modes are enabled only when !TARGET_HAVE_MVE (V8QI, ...), and this
> helps writing a simpler expander.
>
> However, vneg is used by vshr (right-shifts by register are
> implemented as left-shift by negation of that register), so the
> expander uses something like:
>
> emit_insn (gen_neg<mode>2 (neg, operands[2]));
> if (TARGET_NEON)
> emit_insn (gen_ashl<mode>3_signed (operands[0], operands[1], neg));
> else
> emit_insn (gen_mve_vshlq_s<mode> (operands[0], operands[1], neg));
>
> which does not work if the iterator has conditional members: the
> 'else' part is still generated for <mode> unsupported by MVE.
>
> So.... I guess my question is: do we want to enforce implementation
> of Neon / MVE common parts? There are already lots of partly
> overlapping/duplicate iterators. I have tried to split iterators into
> eg VDQ_COMMON_TO_NEON_AND_MVE and VDQ_NEON_ONLY but this means we have
> to basically duplicate the expanders which defeats the point...
Ideally I think we'd want a minimal number iterators and defines, which
was the idea behind the conditional iterators disabling 64-bit modes for
MVE.
Obviously that then breaks the code above. For this specific case I
would suggest unifying define_insns ashl<mode>3_{signed,unsigned} and
mve_vshlq_<supf><mode>, they are very much the same patterns, I also
don't understand why ahsl's signed and unsigned are separate. For
instance create a 'ashl3_<supf>_<mode>' or something like that, and make
sure the calls to gen_ashl3<mode>3_{unsigned,signed} now call to
gen_ashl3_<supf>_<mode> and that arm_mve_builtins.def use
ashl3_<supf>_<mode> instead of this, <mode> needs to be at the end of
the name for the builtin construct. Whether this 'form' would work
everywhere, I don't know. And I suspect you might find more issues like
this. If there are more than you are willing to change right now then
maybe the easier step forward is to try to tackle them one at a time,
and use a new conditional iterator where you've been able to merge NEON
and MVE patterns.
As a general strategy I think we should try to clean the mess up, but I
don't think we should try to clean it all up in one go as that will
probably lead to it not getting done at all. I'm not the maintainer, so
I'd be curious to see how Kyrill feels about this, but in my opinion we
should take patches that don't make it less maintainable, so if you can
clean it up as much as possible, great! Otherwise if its not making the
mess bigger and its enabling auto-vec then I personally don't see why it
shouldn't be accepted.
> Or we can keep different expanders for Neon and MVE? But we have
> already quite a few in vec-common.md.
We can't keep different expanders if they expand the same optab with the
same modes in the same backend. So we will always have to make NEON and
MVE work together.
More information about the Gcc-patches
mailing list