]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
x86: Broadcast from integer to a pseudo vector register
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 23 Aug 2021 21:47:03 +0000 (14:47 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 24 Aug 2021 12:46:17 +0000 (05:46 -0700)
Broadcast from integer to a pseudo vector register instead of a hard
vector register to allow LRA to remove redundant move instruction after
broadcast.

gcc/

PR target/102021
* config/i386/i386-expand.c (ix86_expand_vector_move): Broadcast
from integer to a pseudo vector register.

gcc/testsuite/

PR target/102021
* gcc.target/i386/pr100865-10b.c: Expect vzeroupper.
* gcc.target/i386/pr100865-4b.c: Likewise.
* gcc.target/i386/pr100865-6b.c: Expect vmovdqu and vzeroupper.
* gcc.target/i386/pr100865-7b.c: Likewise.
* gcc.target/i386/pr102021.c: New test.

gcc/config/i386/i386-expand.c
gcc/testsuite/gcc.target/i386/pr100865-10b.c
gcc/testsuite/gcc.target/i386/pr100865-4b.c
gcc/testsuite/gcc.target/i386/pr100865-6b.c
gcc/testsuite/gcc.target/i386/pr100865-7b.c
gcc/testsuite/gcc.target/i386/pr102021.c [new file with mode: 0644]

index 9bf13dbfa92e9f800e3fae9d85620dfd44adf5e0..2500dbfa7fb9d76869e7853bf302da5627c9be43 100644 (file)
@@ -579,19 +579,10 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[])
        {
          /* Broadcast to XMM/YMM/ZMM register from an integer
             constant or scalar mem.  */
-         /* Hard registers are used for 2 purposes:
-            1. Prevent stack realignment when the original code
-            doesn't use vector registers, which is the same for
-            memcpy and memset.
-            2. Prevent combine to convert constant broadcast to
-            load from constant pool.  */
-         op1 = ix86_gen_scratch_sse_rtx (mode);
+         op1 = gen_reg_rtx (mode);
          if (FLOAT_MODE_P (mode)
              || (!TARGET_64BIT && GET_MODE_INNER (mode) == DImode))
-           {
-             first = force_const_mem (GET_MODE_INNER (mode), first);
-             op1 = gen_reg_rtx (mode);
-           }
+           first = force_const_mem (GET_MODE_INNER (mode), first);
          bool ok = ix86_expand_vector_init_duplicate (false, mode,
                                                       op1, first);
          gcc_assert (ok);
index 77ace86ffe854088483004d724153332edf02daf..e5616d8d258791514788239663b78c7f93078c25 100644 (file)
@@ -5,4 +5,3 @@
 
 /* { dg-final { scan-assembler-times "vpbroadcastb\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
 /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]%ymm\[0-9\]+, " 8 } } */
-/* { dg-final { scan-assembler-not "vzeroupper" } } */
index 80e9fdb12ea9734bd4a008173759a8b559bed97b..6d9cb91b8e9bf48e55a7139b2817f85a53ec4676 100644 (file)
@@ -5,7 +5,6 @@
 
 /* { dg-final { scan-assembler-times "vpbroadcastb\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
 /* { dg-final { scan-assembler-times "vmovdqu8\[\\t \]%ymm\[0-9\]+, " 2 } } */
-/* { dg-final { scan-assembler-times "vzeroupper" 1 { target ia32 } } } */
-/* { dg-final { scan-assembler-not "vzeroupper" { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-times "vzeroupper" 1 } } */
 /* { dg-final { scan-assembler-not "vpbroadcastb\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
 /* { dg-final { scan-assembler-not "vmovdqa" } } */
index 35f2e961d259ac10147ad861eb83aae9f70d8821..9588249cb02c7234e92db20e6e661c1a6b2d3754 100644 (file)
@@ -4,9 +4,7 @@
 #include "pr100865-6a.c"
 
 /* { dg-final { scan-assembler-times "vpbroadcastd\[\\t \]+%(?:r|e)\[^\n\]*, %ymm\[0-9\]+" 1 } } */
-/* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 8 { target ia32 } } } */
-/* { dg-final { scan-assembler-times "vmovdqu32\[\\t \]%ymm\[0-9\]+, " 8 { target { ! ia32 } } } } */
-/* { dg-final { scan-assembler-times "vzeroupper" 1 { target ia32 } } } */
-/* { dg-final { scan-assembler-not "vzeroupper" { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 8 } } */
+/* { dg-final { scan-assembler-times "vzeroupper" 1 } } */
 /* { dg-final { scan-assembler-not "vpbroadcastd\[\\t \]+%xmm\[0-9\]+, %ymm\[0-9\]+" } } */
 /* { dg-final { scan-assembler-not "vmovdqa" } } */
index ad267c43891ee41bde46e0be30b219967afb11fd..3b20c6805213eaa8e7a908cf3461bea17f00e388 100644 (file)
@@ -5,8 +5,6 @@
 
 /* { dg-final { scan-assembler-times "vpbroadcastq\[\\t \]+%r\[^\n\]*, %ymm\[0-9\]+" 1 { target { ! ia32 } } } } */
 /* { dg-final { scan-assembler-times "vpbroadcastq\[\\t \]+\[^\n\]*, %ymm\[0-9\]+" 1 { target ia32 } } } */
-/* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 16 { target ia32 } } } */
-/* { dg-final { scan-assembler-times "vmovdqu64\[\\t \]%ymm\[0-9\]+, " 16 { target { ! ia32 } } } } */
-/* { dg-final { scan-assembler-times "vzeroupper" 1 { target ia32 } } } */
-/* { dg-final { scan-assembler-not "vzeroupper" { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-times "vmovdqu\[\\t \]%ymm\[0-9\]+, " 16 } } */
+/* { dg-final { scan-assembler-times "vzeroupper" 1 } } */
 /* { dg-final { scan-assembler-not "vmovdqa" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr102021.c b/gcc/testsuite/gcc.target/i386/pr102021.c
new file mode 100644 (file)
index 0000000..6db3f57
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=skylake-avx512" } */
+
+#include<immintrin.h>
+
+__m256i
+foo ()
+{
+  return _mm256_set1_epi16 (12);
+}
+
+/* { dg-final { scan-assembler-times "vpbroadcastq\[\\t \]+%r\[^\n\]*, %ymm\[0-9\]+" 1 { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-times "vpbroadcastq\[\\t \]+\[^\n\]*, %ymm\[0-9\]+" 1 { target ia32 } } } */
+/* { dg-final { scan-assembler-not "vmovdqa" } } */
+/* { dg-final { scan-assembler-not "vzeroupper" } } */