aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-04-29 11:52:08 +0200
committerRichard Biener <rguenther@suse.de>2021-04-29 11:55:12 +0200
commitaf4ccaa7515b8e72449448c509916575831e6292 (patch)
treeee7992b6ec100baca95eeaf5b04c28a6dee4e9df /gcc
parent62a44a9797edce11b1f7051ea0016ee975d41233 (diff)
downloadgcc-af4ccaa7515b8e72449448c509916575831e6292.zip
gcc-af4ccaa7515b8e72449448c509916575831e6292.tar.gz
gcc-af4ccaa7515b8e72449448c509916575831e6292.tar.bz2
tree-optimization/100253 - fix bogus aligned vectorized loads/stores
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.dg/pr100253.C33
-rw-r--r--gcc/tree-vect-stmts.c18
2 files changed, 37 insertions, 14 deletions
diff --git a/gcc/testsuite/g++.dg/pr100253.C b/gcc/testsuite/g++.dg/pr100253.C
new file mode 100644
index 0000000..0102caa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr100253.C
@@ -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;
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 4c01e82..bd2a1c8 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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,