[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) {