[PATCH] i386: Punt on broadcasts from TImode integers [PR101286]

Hongtao Liu crazylht@gmail.com
Fri Jul 2 08:08:24 GMT 2021


On Fri, Jul 2, 2021 at 3:32 PM Jakub Jelinek <jakub@redhat.com> wrote:
>
> Hi!
>
> ix86_expand_vector_init_duplicate doesn't handle TImode -> V2TImode
> or TImode -> V4TImode broadcasts, so I think we should punt on TImode
> inner mode in ix86_broadcast_from_integer_constant, otherwise we ICE
> in ix86_expand_vector_move when ix86_broadcast_from_integer_constant
> returns non-NULL and ix86_expand_vector_init_duplicate returns false.
>
> In theory TImode element broadcasts could be handled by some permutations,
> but I'm not sure it is worth it.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok.

BTW we do have vbroadcastf32x4 to broadcast 128bit data from memory to
ymm/zmm under AVX512.
>
> 2021-07-02  Jakub Jelinek  <jakub@redhat.com>
>
>         PR target/101286
>         * config/i386/i386-expand.c (ix86_broadcast_from_integer_constant):
>         Return nullptr for TImode inner mode.
>
>         * gcc.target/i386/avx2-pr101286.c: New test.
>
> --- gcc/config/i386/i386-expand.c.jj    2021-07-01 22:29:24.991375023 +0200
> +++ gcc/config/i386/i386-expand.c       2021-07-01 22:45:29.373773262 +0200
> @@ -478,6 +478,9 @@ ix86_broadcast_from_integer_constant (ma
>    if (GET_MODE_INNER (mode) == DImode && !TARGET_64BIT)
>      return nullptr;
>
> +  if (GET_MODE_INNER (mode) == TImode)
> +    return nullptr;
> +
>    rtx constant = get_pool_constant (XEXP (op, 0));
>    if (GET_CODE (constant) != CONST_VECTOR)
>      return nullptr;
> --- gcc/testsuite/gcc.target/i386/avx2-pr101286.c.jj    2021-07-01 22:44:31.388594997 +0200
> +++ gcc/testsuite/gcc.target/i386/avx2-pr101286.c       2021-07-01 22:45:12.688009721 +0200
> @@ -0,0 +1,11 @@
> +/* PR target/101286 */
> +/* { dg-do compile { target int128 } } */
> +/* { dg-options "-mavx2" } */
> +
> +typedef __attribute__((__vector_size__ (2 * sizeof (__int128)))) __int128 V;
> +
> +V
> +foo (void)
> +{
> +  return (V){(__int128) 1 << 64 | 1, (__int128) 1 << 64 | 1};
> +}
>
>         Jakub
>


-- 
BR,
Hongtao


More information about the Gcc-patches mailing list