Check CONST0_RTX and CONSTM1_RTX when placing

(insn 32 2 7 2 (set (reg:V2DI 114)
        (const_vector:V2DI [
                (const_int 0 [0]) repeated x2
            ])) -1
     (nil))

after

(note 2 3 32 2 NOTE_INSN_FUNCTION_BEG)

for X86_CSE_VEC_DUP, not X86_CSE_CONST0_VECTOR or X86_CSE_CONSTM1_VECTOR,
after replacing redundant vector loads:

(insn 31 15 16 2 (set (reg/v/f:DI 99 [ d ])
        (const_int 0 [0])) "x.c":5:16 -1
     (nil))
...
(insn 18 17 19 2 (set (reg:V2DI 111 [ _22 ])
        (vec_duplicate:V2DI (reg/v/f:DI 99 [ d ]))) "x.c":5:16 9345
{*vec_dupv2di}
     (nil))

...
(insn 29 12 15 2 (set (reg/v/f:DI 98 [ c ])
        (const_int 0 [0])) "x.c":5:16 -1
     (nil))
...
(insn 20 19 21 2 (set (reg:V2DI 112 [ _20 ])
        (vec_duplicate:V2DI (reg/v/f:DI 98 [ c ]))) "x.c":5:16 9345
{*vec_dupv2di}
     (nil))

with

(insn 18 17 19 2 (set (reg:V2DI 111 [ _22 ])
        (reg:V2DI 114)) "x.c":5:16 2454 {movv2di_internal}
     (nil))

and

(insn 20 19 21 2 (set (reg:V2DI 112 [ _20 ])
        (reg:V2DI 114)) "x.c":5:16 2454 {movv2di_internal}
     (nil))

gcc/

PR target/125239
* config/i386/i386-features.cc (ix86_place_single_vector_set):
Check CONST0_RTX and CONSTM1_RTX for X86_CSE_VEC_DUP.

gcc/testsuite/

PR target/125239
* gcc.target/i386/pr125239.c: New test.


-- 
H.J.
From d3f87e2ba3fdce1a82de72b5c93ecfbb35f7ba35 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Sat, 9 May 2026 05:58:09 +0800
Subject: [PATCH] x86_cse: Check CONST0_RTX and CONSTM1_RTX for X86_CSE_VEC_DUP

Check CONST0_RTX and CONSTM1_RTX when placing

(insn 32 2 7 2 (set (reg:V2DI 114)
        (const_vector:V2DI [
                (const_int 0 [0]) repeated x2
            ])) -1
     (nil))

after

(note 2 3 32 2 NOTE_INSN_FUNCTION_BEG)

for X86_CSE_VEC_DUP, not X86_CSE_CONST0_VECTOR or X86_CSE_CONSTM1_VECTOR,
after replacing redundant vector loads:

(insn 31 15 16 2 (set (reg/v/f:DI 99 [ d ])
        (const_int 0 [0])) "x.c":5:16 -1
     (nil))
...
(insn 18 17 19 2 (set (reg:V2DI 111 [ _22 ])
        (vec_duplicate:V2DI (reg/v/f:DI 99 [ d ]))) "x.c":5:16 9345 {*vec_dupv2di}
     (nil))

...
(insn 29 12 15 2 (set (reg/v/f:DI 98 [ c ])
        (const_int 0 [0])) "x.c":5:16 -1
     (nil))
...
(insn 20 19 21 2 (set (reg:V2DI 112 [ _20 ])
        (vec_duplicate:V2DI (reg/v/f:DI 98 [ c ]))) "x.c":5:16 9345 {*vec_dupv2di}
     (nil))

with

(insn 18 17 19 2 (set (reg:V2DI 111 [ _22 ])
        (reg:V2DI 114)) "x.c":5:16 2454 {movv2di_internal}
     (nil))

and

(insn 20 19 21 2 (set (reg:V2DI 112 [ _20 ])
        (reg:V2DI 114)) "x.c":5:16 2454 {movv2di_internal}
     (nil))

gcc/

	PR target/125239
	* config/i386/i386-features.cc (ix86_place_single_vector_set):
	Check CONST0_RTX and CONSTM1_RTX for X86_CSE_VEC_DUP.

gcc/testsuite/

	PR target/125239
	* gcc.target/i386/pr125239.c: New test.

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

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index bf6cbe094e1..c53c6c8e133 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3332,6 +3332,21 @@ ix86_place_single_vector_set (rtx dest, rtx src, bitmap bbs,
 
   if (load && load->kind == X86_CSE_VEC_DUP)
     {
+      if (CONST_VECTOR_P (src))
+	{
+	  machine_mode mode = GET_MODE (dest);
+	  if (src == CONST0_RTX (mode) || src == CONSTM1_RTX (mode))
+	    return;
+
+	  /* The only possible CONST_VECTORs of SRC here are CONST0_RTX
+	     and CONSTM1_RTX.  Otherwise,
+
+	     rtx set = gen_rtx_SET (dest, src);
+
+	     above won't be a valid instruction.  */
+	  gcc_unreachable ();
+	}
+
       /* Get the source from LOAD as (reg:SI 99) in
 
 	 (vec_duplicate:V4SI (reg:SI 99))
diff --git a/gcc/testsuite/gcc.target/i386/pr125239.c b/gcc/testsuite/gcc.target/i386/pr125239.c
new file mode 100644
index 00000000000..7ebf45ed661
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr125239.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=x86-64 -fno-tree-dse -fno-tree-dce" } */
+
+extern void a (void);
+void
+b (void)
+{
+  int *c, *d, *e[2][20] = {{c}, {c, d, d, d, c, c, d, c}};
+  a ();
+}
-- 
2.54.0

Reply via email to