https://gcc.gnu.org/g:ed5d77a4e802288acfaff71f1a0fb6a54a7c6a35

commit r17-1581-ged5d77a4e802288acfaff71f1a0fb6a54a7c6a35
Author: H.J. Lu <[email protected]>
Date:   Tue Jun 16 06:51:29 2026 +0800

    x86: Replace gen_rtx_SUBREG with gen_lowpart
    
    Replace gen_rtx_SUBREG with gen_lowpart when generating E_HImode RTX on
    destination of
    
    (subreg:V2QI (reg:HI 111 [ vect__6.14_46 ]) 0)
    
    with CONST_INT source.
    
    gcc/
    
            PR target/125614
            * config/i386/i386-features.cc (replace_vector_const): Replace
            gen_rtx_SUBREG with gen_lowpart.
    
    gcc/testsuite/
    
            PR target/125614
            * gcc.target/i386/pr125614.c: New file.
    
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 gcc/config/i386/i386-features.cc         |  2 +-
 gcc/testsuite/gcc.target/i386/pr125614.c | 27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 68d76d364ccb..c0282f689861 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -3806,7 +3806,7 @@ replace_vector_const (machine_mode vector_mode, rtx 
vector_const,
       SET_SRC (set) = replace;
       if (CONST_INT_P (replace))
        {
-         dest = gen_rtx_SUBREG (scalar_mode, dest, 0);
+         dest = gen_lowpart (scalar_mode, dest);
          SET_DEST (set) = dest;
        }
       /* Drop possible dead definitions.  */
diff --git a/gcc/testsuite/gcc.target/i386/pr125614.c 
b/gcc/testsuite/gcc.target/i386/pr125614.c
new file mode 100644
index 000000000000..22127fb398de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr125614.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-dce -fno-tree-fre -march=x86-64" } */
+
+int b, c;
+int
+a (void)
+{
+  char d[8];
+  int e = 0;
+  if (b)
+    goto f;
+  if (c)
+    {
+      for (int g = 0; g < 8; ++g)
+        d[g] = g;
+      a ();
+      d[0] = -d[0];
+      d[1] = -d[1];
+    f:
+      int h;
+      if (h)
+        __builtin_abort ();
+      e = d[0];
+      e = d[1] + e;
+    }
+  return e;
+}

Reply via email to