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.
This commit is contained in:
Richard Biener 2021-04-29 11:52:08 +02:00
parent 62a44a9797
commit af4ccaa751
2 changed files with 37 additions and 14 deletions

View file

@ -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;
}

View 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,