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)); +} +
