vect, aarch64: Fix alignment units for IFN_MASK* [PR95401]
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 4 Jan 2021 14:44:21 +0000 (14:44 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Mon, 4 Jan 2021 14:44:21 +0000 (14:44 +0000)
commitaa204d511859e4859cbe35a867ac407addb4ff54
tree06b4c2f88665e2d94605c8ed29a301a9333245de
parent6288183377a0dc8f02ad415eb1ac9338507445aa
vect, aarch64: Fix alignment units for IFN_MASK* [PR95401]

The IFN_MASK* functions take two leading arguments: a load or
store pointer and a “cookie”.  The type of the cookie is the
type of the access for TBAA purposes (like for MEM_REFs)
while the value of the cookie is the alignment of the access.
This PR was caused by a disagreement about whether the alignment
is measured in bits or bytes.

It looks like this goes back to PR68786, which made the
vectoriser create its own cookie argument rather than reusing
the one created by ifcvt.  The alignment value of the new cookie
was measured in bytes (as needed by set_ptr_info_alignment)
while the existing code expected it to be measured in bits.
The folds I added for IFN_MASK_LOAD and STORE then made
things worse.

gcc/
PR tree-optimization/95401
* config/aarch64/aarch64-sve-builtins.cc
(gimple_folder::load_store_cookie): Use bits rather than bytes
for the alignment argument to IFN_MASK_LOAD and IFN_MASK_STORE.
* gimple-fold.c (gimple_fold_mask_load_store_mem_ref): Likewise.
* tree-vect-stmts.c (vectorizable_store): Likewise.
(vectorizable_load): Likewise.

gcc/testsuite/
PR tree-optimization/95401
* g++.dg/vect/pr95401.cc: New test.
* g++.dg/vect/pr95401a.cc: Likewise.
gcc/config/aarch64/aarch64-sve-builtins.cc
gcc/gimple-fold.c
gcc/testsuite/g++.dg/vect/pr95401.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/vect/pr95401a.cc [new file with mode: 0644]
gcc/tree-vect-stmts.c