https://gcc.gnu.org/g:294ed2e130236303667a3f153f41ee7f0ce37aa9

commit r15-11677-g294ed2e130236303667a3f153f41ee7f0ce37aa9
Author: liuhongt <[email protected]>
Date:   Thu Oct 15 00:29:50 2026 -0700

    i386: Avoid emulated broadcasts of vector constants [PR127897]
    
    Only broadcast floating-point constants when a broadcast instruction
    is available (AVX, or AVX2 for 16-bit elements), avoiding sequences such
    as movss + shufps.
    
            PR target/127897
    
    gcc/ChangeLog:
    
            * config/i386/i386-expand.cc (ix86_expand_vector_move): Only
            broadcast floating-point constants when a broadcast instruction
            is available.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/i386/pr127897-1.c: New test.
            * gcc.target/i386/pr127897-3.c: Likewise.
    
     (cherry picked from commit b2f4da30289466ed982464203d5e552f83421fe8)

Diff:
---
 gcc/config/i386/i386-expand.cc             |  7 ++++++-
 gcc/testsuite/gcc.target/i386/pr127897-1.c | 20 ++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr127897-3.c | 13 +++++++++++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 78d30974bf95..ba0d9fb517a3 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -698,7 +698,12 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[])
          && CONSTANT_POOL_ADDRESS_P (XEXP (op1, 0))))
     {
       rtx first = ix86_broadcast_from_constant (mode, op1);
-      if (first != nullptr)
+      /* Only broadcast floating-point constants when a broadcast instruction
+        is available (AVX, or AVX2 for 16-bit elements), avoiding sequences
+        such as movss + shufps.  */
+      if (first != nullptr
+         && (!FLOAT_MODE_P (mode)
+             || (GET_MODE_UNIT_SIZE (mode) < 4 ? TARGET_AVX2 : TARGET_AVX)))
        {
          /* Broadcast to XMM/YMM/ZMM register from an integer
             constant or scalar mem.  */
diff --git a/gcc/testsuite/gcc.target/i386/pr127897-1.c 
b/gcc/testsuite/gcc.target/i386/pr127897-1.c
new file mode 100644
index 000000000000..f765fe2d5c65
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr127897-1.c
@@ -0,0 +1,20 @@
+/* PR target/127897 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse4.1 -mno-avx" } */
+/* { dg-final { scan-assembler-not "shufps" } } */
+/* { dg-final { scan-assembler-not "movss" } } */
+/* { dg-final { scan-assembler-not "movddup" } } */
+
+#include <immintrin.h>
+
+__m128
+f (__m128 x)
+{
+  return _mm_add_ps (_mm_mul_ps (x, _mm_set1_ps (1.5f)), _mm_set1_ps (0.25f));
+}
+
+__m128d
+g (__m128d x)
+{
+  return _mm_mul_pd (x, _mm_set1_pd (1.5));
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr127897-3.c 
b/gcc/testsuite/gcc.target/i386/pr127897-3.c
new file mode 100644
index 000000000000..1f3c0bd02741
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr127897-3.c
@@ -0,0 +1,13 @@
+/* PR target/127897 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx2 -mno-avx512f" } */
+/* { dg-final { scan-assembler-times "vbroadcastss" 2 } } */
+
+#include <immintrin.h>
+
+__m128
+f (__m128 x)
+{
+  return _mm_add_ps (_mm_mul_ps (x, _mm_set1_ps (1.5f)), _mm_set1_ps (0.25f));
+}
+

Reply via email to