aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-07-02 10:06:56 +0200
committerJakub Jelinek <jakub@redhat.com>2021-07-02 10:06:56 +0200
commitf7cad1a0ffe9f003ec347521dfd33f320f4c2b04 (patch)
treee62ba6d6331f7d9fdcd16856b5df7fdcba78a6e6 /gcc
parentc4804ff24401733e3b470a49b8a6c9306e6cfcfa (diff)
downloadgcc-f7cad1a0ffe9f003ec347521dfd33f320f4c2b04.zip
gcc-f7cad1a0ffe9f003ec347521dfd33f320f4c2b04.tar.gz
gcc-f7cad1a0ffe9f003ec347521dfd33f320f4c2b04.tar.bz2
i386: Punt on broadcasts from TImode integers [PR101286]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386-expand.c3
-rw-r--r--gcc/testsuite/gcc.target/i386/avx2-pr101286.c11
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index a63319a..b37642e 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -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
index 0000000..81917bf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/avx2-pr101286.c
@@ -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};
+}