On Sun, Jun 21, 2026 at 4:14 PM Uros Bizjak <[email protected]> wrote:
>
> On Sat, Jun 20, 2026 at 6:04 AM H.J. Lu <[email protected]> wrote:
> >
> > 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.
>
> + 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 ();
> +  }
>
> int_mode_for_mode ?
>
> Uros.

Done.  Here is the v2 patch.

Thanks.

-- 
H.J.
From 0ad95fac55ee8f36ca7746e2aa77683ba3a3bf49 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Fri, 19 Jun 2026 16:31:26 +0800
Subject: [PATCH v2] 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         | 11 +++++++++++
 gcc/testsuite/gcc.target/i386/pr125895.c | 10 ++++++++++
 2 files changed, 21 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 5ad48c0e088..2b2b2059cb6 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -5052,6 +5052,17 @@ 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);
+			class scalar_mode i_mode
+			  = int_mode_for_mode (imode).require ();
+			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