]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/100253 - fix bogus aligned vectorized loads/stores
authorRichard Biener <rguenther@suse.de>
Thu, 29 Apr 2021 09:52:08 +0000 (11:52 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 5 May 2021 07:54:03 +0000 (09:54 +0200)
At some point DR_MISALIGNMENT was supposed to be -1 when the
access was not element aligned.  That's obviously not true at this
point so this adjusts both store and load vectorizing to no longer
assume this which in turn allows simplifying the code.

2021-04-29  Richard Biener  <rguenther@suse.de>

PR tree-optimization/100253
* tree-vect-stmts.c (vectorizable_load): Do not assume
element alignment when DR_MISALIGNMENT is -1.
(vectorizable_store): Likewise.

* g++.dg/pr100253.C: New testcase.

(cherry picked from commit af4ccaa7515b8e72449448c509916575831e6292)

gcc/testsuite/g++.dg/pr100253.C [new file with mode: 0644]
gcc/tree-vect-stmts.c

diff --git a/gcc/testsuite/g++.dg/pr100253.C b/gcc/testsuite/g++.dg/pr100253.C
new file mode 100644 (file)
index 0000000..0102caa
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-tree-bit-ccp -ftree-slp-vectorize" } */
+
+#include <vector>
+
+struct T
+{
+};
+
+struct S
+{
+  std::vector < std::vector < T > > v;
+  char x;
+  char y[16];
+  char z[16];
+};
+
+S s, g[1];
+
+void
+foo (char *buf)
+{
+  s = g[*buf];
+}
+
+char c;
+
+int
+main ()
+{
+  foo (&c);
+  return 0;
+}
index 4c01e82ff394f911153b7bfe1dcec36d41853ded..bd2a1c89e6708314efdad3274d100a5b3d6e62b1 100644 (file)
@@ -8166,6 +8166,7 @@ vectorizable_store (vec_info *vinfo,
                  && TREE_CODE (dataref_ptr) == SSA_NAME)
                set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
                                        misalign);
+             align = least_bit_hwi (misalign | align);
 
              if (memory_access_type == VMAT_CONTIGUOUS_REVERSE)
                {
@@ -8187,7 +8188,6 @@ vectorizable_store (vec_info *vinfo,
              /* Arguments are ready.  Create the new vector stmt.  */
              if (final_mask)
                {
-                 align = least_bit_hwi (misalign | align);
                  tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
                  gcall *call
                    = gimple_build_call_internal (IFN_MASK_STORE, 4,
@@ -8202,7 +8202,6 @@ vectorizable_store (vec_info *vinfo,
                  tree final_len
                    = vect_get_loop_len (loop_vinfo, loop_lens,
                                         vec_num * ncopies, vec_num * j + i);
-                 align = least_bit_hwi (misalign | align);
                  tree ptr = build_int_cst (ref_type, align * BITS_PER_UNIT);
                  machine_mode vmode = TYPE_MODE (vectype);
                  opt_machine_mode new_ovmode
@@ -8241,14 +8240,10 @@ vectorizable_store (vec_info *vinfo,
                                          : build_int_cst (ref_type, 0));
                  if (aligned_access_p (first_dr_info))
                    ;
-                 else if (DR_MISALIGNMENT (first_dr_info) == -1)
-                   TREE_TYPE (data_ref)
-                     = build_aligned_type (TREE_TYPE (data_ref),
-                                           align * BITS_PER_UNIT);
                  else
                    TREE_TYPE (data_ref)
                      = build_aligned_type (TREE_TYPE (data_ref),
-                                           TYPE_ALIGN (elem_type));
+                                           align * BITS_PER_UNIT);
                  vect_copy_ref_info (data_ref, DR_REF (first_dr_info->dr));
                  new_stmt = gimple_build_assign (data_ref, vec_oprnd);
                  vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
@@ -9452,10 +9447,10 @@ vectorizable_load (vec_info *vinfo,
                        && TREE_CODE (dataref_ptr) == SSA_NAME)
                      set_ptr_info_alignment (get_ptr_info (dataref_ptr),
                                              align, misalign);
+                   align = least_bit_hwi (misalign | align);
 
                    if (final_mask)
                      {
-                       align = least_bit_hwi (misalign | align);
                        tree ptr = build_int_cst (ref_type,
                                                  align * BITS_PER_UNIT);
                        gcall *call
@@ -9472,7 +9467,6 @@ vectorizable_load (vec_info *vinfo,
                          = vect_get_loop_len (loop_vinfo, loop_lens,
                                               vec_num * ncopies,
                                               vec_num * j + i);
-                       align = least_bit_hwi (misalign | align);
                        tree ptr = build_int_cst (ref_type,
                                                  align * BITS_PER_UNIT);
                        gcall *call
@@ -9548,14 +9542,10 @@ vectorizable_load (vec_info *vinfo,
                          = fold_build2 (MEM_REF, ltype, dataref_ptr, offset);
                        if (alignment_support_scheme == dr_aligned)
                          ;
-                       else if (DR_MISALIGNMENT (first_dr_info) == -1)
-                         TREE_TYPE (data_ref)
-                           = build_aligned_type (TREE_TYPE (data_ref),
-                                                 align * BITS_PER_UNIT);
                        else
                          TREE_TYPE (data_ref)
                            = build_aligned_type (TREE_TYPE (data_ref),
-                                                 TYPE_ALIGN (elem_type));
+                                                 align * BITS_PER_UNIT);
                        if (ltype != vectype)
                          {
                            vect_copy_ref_info (data_ref,