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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, will push later
today and also backport to branches.

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]>
---
 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.target/i386/preserve-none-35a.c       |  6 ++---
 .../gcc.target/i386/preserve-none-35b.c       |  6 ++---
 .../gcc.target/i386/preserve-none-35c.c       |  6 ++---
 .../gcc.target/i386/preserve-none-35d.c       |  4 ++--
 .../gcc.target/i386/preserve-none-35e.c       |  4 ++--
 .../gcc.target/i386/preserve-none-35f.c       |  4 ++--
 .../gcc.target/i386/preserve-none-35g.c       |  4 ++--
 gcc/tree-vect-stmts.cc                        |  6 +++--
 14 files changed, 95 insertions(+), 19 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-1a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-1b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-1c.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-2a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-2b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126410-2c.c

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 00000000000..489064cda6b
--- /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 00000000000..7e7141eb2e0
--- /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 00000000000..8b5fb5bc150
--- /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 00000000000..8bd45573145
--- /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 00000000000..30743cd73f1
--- /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 00000000000..d618b36e15b
--- /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 177bf8730e4..71af191e418 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 76ee7f79c93..61ab8ac5c5f 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 8a307207693..081ffe5eadf 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 4a362233587..dd45ad4335c 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 510281c7a79..98355c59d78 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 301a357a3cf..6aa8fb64d02 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 3057456c630..89af519e2a8 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 488b9754bed..c5a86d3a1a4 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)
     {
-- 
2.51.0

Reply via email to