[gcc r17-2749] vectorizer: Don't enlarge base alignment during costing

Richard Biener via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:7c7c6626410c261d188a96d9b2a15d3781d0dcfb

commit r17-2749-g7c7c6626410c261d188a96d9b2a15d3781d0dcfb
Author: H.J. Lu <[email protected]>
Date:   Sun Jul 26 19:21:55 2026 +0800

    vectorizer: Don't enlarge base alignment during costing
    
    We errorneously commit the recorded base alignment during costing
    since the costing refactoring.  This causes alignment to be
    computed based on a possibly larger vector type than used in the
    end.
    
    gcc/
    
            PR middle-end/126410
            * tree-vect-stmts.cc (vectorizable_store): Only commit to
            recorded base alignment when transforming.
            (vectorizable_load): Likewise.
    
    gcc/testsuite/
    
            PR middle-end/126410
            * gcc.target/i386/pr126410-1a.c: New test.
            * gcc.target/i386/pr126410-1b.c: Likewise.
            * gcc.target/i386/pr126410-1c.c: Likewise.
            * gcc.target/i386/pr126410-2a.c: Likewise.
            * gcc.target/i386/pr126410-2b.c: Likewise.
            * gcc.target/i386/pr126410-2c.c: Likewise.
            * gcc.target/i386/preserve-none-35a.c: Adjust.
            * gcc.target/i386/preserve-none-35b.c: Likewise.
            * gcc.target/i386/preserve-none-35c.c: Likewise.
            * gcc.target/i386/preserve-none-35d.c: Likewise.
            * gcc.target/i386/preserve-none-35e.c: Likewise.
            * gcc.target/i386/preserve-none-35f.c: Likewise.
            * gcc.target/i386/preserve-none-35g.c: Likewise.
    
    Co-Authored-By: Richard Biener  <[email protected]>
    Signed-off-by: H.J. Lu <[email protected]>

Diff:
---
 gcc/testsuite/gcc.target/i386/pr126410-1a.c       | 22 ++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr126410-1b.c       |  8 ++++++++
 gcc/testsuite/gcc.target/i386/pr126410-1c.c       |  7 +++++++
 gcc/testsuite/gcc.target/i386/pr126410-2a.c       | 22 ++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/pr126410-2b.c       |  8 ++++++++
 gcc/testsuite/gcc.target/i386/pr126410-2c.c       |  7 +++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35a.c |  6 +++---
 gcc/testsuite/gcc.target/i386/preserve-none-35b.c |  6 +++---
 gcc/testsuite/gcc.target/i386/preserve-none-35c.c |  6 +++---
 gcc/testsuite/gcc.target/i386/preserve-none-35d.c |  4 ++--
 gcc/testsuite/gcc.target/i386/preserve-none-35e.c |  4 ++--
 gcc/testsuite/gcc.target/i386/preserve-none-35f.c |  4 ++--
 gcc/testsuite/gcc.target/i386/preserve-none-35g.c |  4 ++--
 gcc/tree-vect-stmts.cc                            |  6 ++++--
 14 files changed, 95 insertions(+), 19 deletions(-)

diff --git a/gcc/testsuite/gcc.target/i386/pr126410-1a.c b/gcc/testsuite/gcc.target/i386/pr126410-1a.c
new file mode 100644
index 000000000000..489064cda6b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-1a.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#ifndef N
+#define N 4
+#endif
+
+typedef float vector[N];
+
+extern vector v;
+
+extern void foo (vector *);
+
+void
+func (vector a, vector b)
+{
+  vector r;
+  for (int i = 0; i < N; i++)
+    r[i] = a[i] * b[i];
+  foo (&r);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr126410-1b.c b/gcc/testsuite/gcc.target/i386/pr126410-1b.c
new file mode 100644
index 000000000000..7e7141eb2e08
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-1b.c
@@ -0,0 +1,8 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-32,\[\\t \]*%\[re\]?sp" } } */
+/* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#define N 8
+
+#include "pr126410-1a.c"
diff --git a/gcc/testsuite/gcc.target/i386/pr126410-1c.c b/gcc/testsuite/gcc.target/i386/pr126410-1c.c
new file mode 100644
index 000000000000..8b5fb5bc1503
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-1c.c
@@ -0,0 +1,7 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#define N 16
+
+#include "pr126410-1a.c"
diff --git a/gcc/testsuite/gcc.target/i386/pr126410-2a.c b/gcc/testsuite/gcc.target/i386/pr126410-2a.c
new file mode 100644
index 000000000000..8bd455731456
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-2a.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#ifndef N
+#define N 4
+#endif
+
+typedef struct { float values[N]; } vector;
+
+extern vector v;
+
+extern void foo (vector *);
+
+void
+func (vector a, vector b)
+{
+  vector r;
+  for (int i = 0; i < N; i++)
+    r.values[i] = a.values[i] * b.values[i];
+  foo (&r);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr126410-2b.c b/gcc/testsuite/gcc.target/i386/pr126410-2b.c
new file mode 100644
index 000000000000..30743cd73f1b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-2b.c
@@ -0,0 +1,8 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-32,\[\\t \]*%\[re\]?sp" } } */
+/* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#define N 8
+
+#include "pr126410-2a.c"
diff --git a/gcc/testsuite/gcc.target/i386/pr126410-2c.c b/gcc/testsuite/gcc.target/i386/pr126410-2c.c
new file mode 100644
index 000000000000..d618b36e15b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126410-2c.c
@@ -0,0 +1,7 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -march=x86-64-v4 -fomit-frame-pointer" } */
+/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
+
+#define N 16
+
+#include "pr126410-2a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35a.c b/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
index 177bf8730e4d..71af191e4189 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
@@ -20,11 +20,11 @@
 **	movl	64\(%rsp\), %edi
 **	movq	%rsi, 72\(%rsp\)
 **	movl	72\(%rsp\), %esi
-**	movq	%rax, 8\(%rsp\)
-**	leaq	32\(%rsp\), %rax
 **	movq	%rax, 16\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 24\(%rsp\)
 **	xorl	%eax, %eax
-**	movl	\$8, \(%rsp\)
+**	movl	\$8, 8\(%rsp\)
 **	call	continuation
 **	addq	\$88, %rsp
 **	.cfi_def_cfa_offset 8
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35b.c b/gcc/testsuite/gcc.target/i386/preserve-none-35b.c
index 76ee7f79c935..61ab8ac5c5f6 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35b.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35b.c
@@ -21,11 +21,11 @@
 **	movl	64\(%rsp\), %edi
 **	movq	%r9, 72\(%rsp\)
 **	movl	72\(%rsp\), %esi
-**	movq	%rax, 8\(%rsp\)
-**	leaq	32\(%rsp\), %rax
 **	movq	%rax, 16\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 24\(%rsp\)
 **	xorl	%eax, %eax
-**	movl	\$8, \(%rsp\)
+**	movl	\$8, 8\(%rsp\)
 **	call	continuation
 **	addq	\$88, %rsp
 **	.cfi_def_cfa_offset 8
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35c.c b/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
index 8a3072076938..081ffe5eadf1 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
@@ -20,11 +20,11 @@
 **	movl	64\(%rsp\), %r8d
 **	movq	%r9, 72\(%rsp\)
 **	movl	72\(%rsp\), %r9d
-**	movq	%rax, 8\(%rsp\)
-**	leaq	32\(%rsp\), %rax
 **	movq	%rax, 16\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 24\(%rsp\)
 **	xorl	%eax, %eax
-**	movl	\$8, \(%rsp\)
+**	movl	\$8, 8\(%rsp\)
 **	call	continuation
 **	addq	\$88, %rsp
 **	.cfi_def_cfa_offset 8
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35d.c b/gcc/testsuite/gcc.target/i386/preserve-none-35d.c
index 4a362233587b..dd45ad4335c6 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35d.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35d.c
@@ -13,9 +13,9 @@
 **	movq	%rdx, 104\(%rsp\)
 **	movq	%r8, 112\(%rsp\)
 **	movq	%r9, 120\(%rsp\)
-**	movq	\$0, 56\(%rsp\)
 **	movq	\$0, 64\(%rsp\)
-**	movq	%rax, 48\(%rsp\)
+**	movq	\$0, 72\(%rsp\)
+**	movq	%rax, 56\(%rsp\)
 **	cmpl	\$47, %eax
 **	ja	.L2
 **	leal	8\(%rax\), %edx
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35e.c b/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
index 510281c7a793..98355c59d786 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
@@ -13,9 +13,9 @@
 **	movq	%rdx, 104\(%rsp\)
 **	movq	%r8, 112\(%rsp\)
 **	movq	%r9, 120\(%rsp\)
-**	movq	\$0, 56\(%rsp\)
 **	movq	\$0, 64\(%rsp\)
-**	movq	%rax, 48\(%rsp\)
+**	movq	\$0, 72\(%rsp\)
+**	movq	%rax, 56\(%rsp\)
 **	cmpl	\$47, %eax
 **	ja	.L2
 **	leal	8\(%rax\), %edx
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35f.c b/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
index 301a357a3cfb..6aa8fb64d027 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
@@ -13,9 +13,9 @@
 **	movq	%rdx, 104\(%rsp\)
 **	movq	%r8, 112\(%rsp\)
 **	movq	%r9, 120\(%rsp\)
-**	movq	\$0, 56\(%rsp\)
 **	movq	\$0, 64\(%rsp\)
-**	movq	%rax, 48\(%rsp\)
+**	movq	\$0, 72\(%rsp\)
+**	movq	%rax, 56\(%rsp\)
 **	cmpl	\$47, %eax
 **	ja	.L2
 **	leal	8\(%rax\), %edx
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35g.c b/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
index 3057456c6302..89af519e2a89 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
@@ -13,9 +13,9 @@
 **	movq	%rdx, 104\(%rsp\)
 **	movq	%r8, 112\(%rsp\)
 **	movq	%r9, 120\(%rsp\)
-**	movq	\$0, 56\(%rsp\)
 **	movq	\$0, 64\(%rsp\)
-**	movq	%rax, 48\(%rsp\)
+**	movq	\$0, 72\(%rsp\)
+**	movq	%rax, 56\(%rsp\)
 **	cmpl	\$47, %eax
 **	ja	.L2
 **	leal	8\(%rax\), %edx
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 488b9754bed4..c5a86d3a1a43 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -8304,7 +8304,8 @@ vectorizable_store (vec_info *vinfo,
 
   /* Transform.  */
 
-  ensure_base_align (dr_info);
+  if (!costing_p)
+    ensure_base_align (dr_info);
 
   if (STMT_VINFO_SIMD_LANE_ACCESS_P (stmt_info) >= 3)
     {
@@ -9986,7 +9987,8 @@ vectorizable_load (vec_info *vinfo,
   /* Transform.  */
 
   dr_vec_info *dr_info = STMT_VINFO_DR_INFO (stmt_info), *first_dr_info = NULL;
-  ensure_base_align (dr_info);
+  if (!costing_p)
+    ensure_base_align (dr_info);
 
   if (memory_access_type == VMAT_INVARIANT)
     {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.