]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Punt on broadcasts from TImode integers [PR101286]
authorJakub Jelinek <jakub@redhat.com>
Fri, 2 Jul 2021 08:06:56 +0000 (10:06 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 2 Jul 2021 08:06:56 +0000 (10:06 +0200)
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.

gcc/config/i386/i386-expand.c
gcc/testsuite/gcc.target/i386/avx2-pr101286.c [new file with mode: 0644]

index a63319aba26357997484d881be95978d106dd238..b37642e35eea6dd9c8c3a439e3fc9f551fe643a0 100644 (file)
@@ -478,6 +478,9 @@ ix86_broadcast_from_integer_constant (machine_mode mode, rtx op)
   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;
diff --git a/gcc/testsuite/gcc.target/i386/avx2-pr101286.c b/gcc/testsuite/gcc.target/i386/avx2-pr101286.c
new file mode 100644 (file)
index 0000000..81917bf
--- /dev/null
@@ -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};
+}