From c980fbf5505dc2f50136d501b67dc3fbf4b08b0d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 29 Apr 2021 11:52:08 +0200 Subject: [PATCH] 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 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 | 33 +++++++++++++++++++++++++++++++++ gcc/tree-vect-stmts.c | 18 ++++-------------- 2 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr100253.C diff --git a/gcc/testsuite/g++.dg/pr100253.C b/gcc/testsuite/g++.dg/pr100253.C new file mode 100644 index 000000000000..0102caa7df86 --- /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 + +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 4c01e82ff394..bd2a1c89e670 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, -- 2.47.3