diff options
author | Richard Biener <rguenther@suse.de> | 2021-04-29 11:52:08 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-04-29 11:55:12 +0200 |
commit | af4ccaa7515b8e72449448c509916575831e6292 (patch) | |
tree | ee7992b6ec100baca95eeaf5b04c28a6dee4e9df /gcc | |
parent | 62a44a9797edce11b1f7051ea0016ee975d41233 (diff) | |
download | gcc-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.C | 33 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 18 |
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, |