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.
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.
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;
--- /dev/null
+/* 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};
+}