On Mon, Aug 5, 2024 at 12:22 PM Roger Sayle <ro...@nextmovesoftware.com> wrote:
>
>
> This patch refactors ashrv2di RTL expansion into a function so that it may
> be reused by a pre-reload splitter, such that DImode right shifts may be
> considered candidates during the Scalar-To-Vector (STV) pass.  Currently
> DImode arithmetic right shifts are not considered potential candidates
> during STV, so for the following testcase:
>
> long long m;
> typedef long long v2di __attribute__((vector_size (16)));
> void foo(v2di x) { m = x[0]>>63; }
>
> We currently see the following warning/error during STV2
> >  r101 use in insn 7 isn't convertible
>
> And end up generating scalar code with an interunit move:
>
> foo:    movq    %xmm0, %rax
>         sarq    $63, %rax
>         movq    %rax, m(%rip)
>         ret
>
> With this patch, we can reuse the RTL expansion logic and produce:
>
> foo:    psrad   $31, %xmm0
>         pshufd  $245, %xmm0, %xmm0
>         movq    %xmm0, m(%rip)
>         ret
>
> Or with the addition of -mavx2, the equivalent:
>
> foo:    vpxor   %xmm1, %xmm1, %xmm1
>         vpcmpgtq        %xmm0, %xmm1, %xmm0
>         vmovq   %xmm0, m(%rip)
>         ret
>
>
> The only design decision of note is the choice to continue lowering V2DI
> into vector sequences during RTL expansion, to enable combine to optimize
> things if possible.  Using just define_insn_and_split potentially misses
> optimizations, such as reusing the zero vector produced by vpxor above.
> It may be necessary to tweak STV's compute gain at some point, but this
> patch controls what's possible (rather than what's beneficial).
>
> This patch has been tested on x86_64-pc-linux-gnu with make bootstrap
> and make -k check, both with and without --target_board=unix{-m32}
> with no new failures.  Ok for mainline?
>
> 2024-08-05  Roger Sayle  <ro...@nextmovesoftware.com>
>
> gcc/ChangeLog
>         * config/i386/i386-expand.cc (ix86_expand_v2di_ashiftrt): New
>         function refactored from define_expand ashrv2di3.
>         * config/i386/i386-features.cc
> (general_scalar_to_vector_candidate_p)
>         <case ASHIFTRT>: Handle like other shifts and rotates.
>         * config/i386/i386-protos.h (ix86_expand_v2di_ashiftrt): Prototype.
>         * config/i386/sse.md (ashrv2di3): Call ix86_expand_v2di_ashiftrt.
>         (*ashrv2di3): New define_insn_and_split to enable creation by stv2
>         pass, and splitting during split1 reusing ix86_expand_v2di_ashiftrt.
>
> gcc/testsuite/ChangeLog
>         * gcc.target/i386/sse2-stv-2.c: New test case.

LGTM.

Thanks,
Uros.

>
>
> Thanks in advance,
> Roger
> --
>

Reply via email to