Use integer CONST_VECTOR:

(const_vector:V2SI [
        (const_int 1073741824 [0x40000000]) repeated x2
    ])

instead of

(const_vector:V2SF [
        (const_int 1073741824 [0x40000000]) repeated x2
    ])

to load FP CONST_VECTOR converted from const_int:

(insn 25 24 27 2 (set (subreg:SI (reg/v:SF 144 [ d ]) 0)
        (const_int 1073741824 [0x40000000])) "x.c":4:18 100 {*movsi_internal}
     (nil))
...
(insn 90 88 91 2 (set (reg:V2SF 202 [ _15 ])
        (vec_duplicate:V2SF (reg/v:SF 144 [ d ]))) "x.c":4:5 2137 {*vec_dupv2sf}
     (expr_list:REG_DEAD (reg/v:SF 144 [ d ])
        (nil)))

into GPR:

(insn 90 88 91 2 (set (subreg:DI (reg:V2SF 202 [ _15 ]) 0)
        (const_int 4611686019501129728 [0x4000000040000000]))
"x.c":4:5 99 {*movdi_internal}
     (expr_list:REG_DEAD (reg/v:SF 144 [ d ])
        (nil)))

gcc/

PR target/125895
* config/i386/i386-features.cc (pass_x86_cse::x86_cse): Use
integer CONST_VECTOR to load FP CONST_VECTOR converted from
const_int.

gcc/testsuite/

PR target/125895
* gcc.target/i386/pr125895.c: New test.

-- 
H.J.
From 56c898dafd9311ce114a216a922a24261b017bff Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Fri, 19 Jun 2026 16:31:26 +0800
Subject: [PATCH] x86_cse: Use integer CONST_VECTOR to load FP CONST_VECTOR

Use integer CONST_VECTOR:

(const_vector:V2SI [
        (const_int 1073741824 [0x40000000]) repeated x2
    ])

instead of

(const_vector:V2SF [
        (const_int 1073741824 [0x40000000]) repeated x2
    ])

to load FP CONST_VECTOR converted from const_int:

(insn 25 24 27 2 (set (subreg:SI (reg/v:SF 144 [ d ]) 0)
        (const_int 1073741824 [0x40000000])) "x.c":4:18 100 {*movsi_internal}
     (nil))
...
(insn 90 88 91 2 (set (reg:V2SF 202 [ _15 ])
        (vec_duplicate:V2SF (reg/v:SF 144 [ d ]))) "x.c":4:5 2137 {*vec_dupv2sf}
     (expr_list:REG_DEAD (reg/v:SF 144 [ d ])
        (nil)))

into GPR:

(insn 90 88 91 2 (set (subreg:DI (reg:V2SF 202 [ _15 ]) 0)
        (const_int 4611686019501129728 [0x4000000040000000])) "x.c":4:5 99 {*movdi_internal}
     (expr_list:REG_DEAD (reg/v:SF 144 [ d ])
        (nil)))

gcc/

	PR target/125895
	* config/i386/i386-features.cc (pass_x86_cse::x86_cse): Use
	integer CONST_VECTOR to load FP CONST_VECTOR converted from
	const_int.

gcc/testsuite/

	PR target/125895
	* gcc.target/i386/pr125895.c: New test.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386-features.cc         | 30 ++++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr125895.c | 10 ++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr125895.c

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index d595f0bc2a3..37c68957cba 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -5040,6 +5040,36 @@ pass_x86_cse::x86_cse (void)
 		    rtvec v = rtvec_alloc (nunits);
 		    for (int j = 0; j < nunits ; j++)
 		      RTVEC_ELT (v, j) = load->val;
+		    if (CONST_INT_P (load->val)
+			&& GET_MODE_CLASS (mode) != MODE_VECTOR_INT)
+		      {
+			gcc_assert (load->size <= UNITS_PER_WORD);
+			machine_mode imode = GET_MODE_INNER (mode);
+			switch (imode)
+			  {
+			  case BFmode:
+			  case HFmode:
+			    imode = HImode;
+			    break;
+
+			  case SFmode:
+			    imode = SImode;
+			    break;
+
+			  case DFmode:
+			    imode = DImode;
+			    break;
+
+			  default:
+			    gcc_unreachable ();
+			  }
+
+			class scalar_mode i_mode
+			  = as_a <class scalar_mode> (imode);
+			mode = mode_for_vector (i_mode,
+						nunits).require ();
+		      }
+
 		    broadcast_source = gen_rtx_CONST_VECTOR (mode, v);
 		  }
 
diff --git a/gcc/testsuite/gcc.target/i386/pr125895.c b/gcc/testsuite/gcc.target/i386/pr125895.c
new file mode 100644
index 00000000000..adc42955e24
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr125895.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64" } */
+
+__attribute__((__vector_size__(2 * sizeof(float)))) float b;
+void a(float d) {
+  double c;
+  b -= *(float *)__builtin_memcpy(&d, &c, 1);
+  __asm__("");
+  a(2);
+}
-- 
2.54.0

Reply via email to