aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Hutton <joel.hutton@arm.com>2021-03-10 12:22:45 +0000
committerJoel Hutton <joel.hutton@arm.com>2021-03-10 12:26:21 +0000
commit99d5299376d203fe5172574c2d6b0b088e532383 (patch)
treef08b76b970cd86cf937498393ca75bab18ecac7e
parent6ceb712e2699a493da544b1755f6f73d62930f9b (diff)
downloadgcc-99d5299376d203fe5172574c2d6b0b088e532383.zip
gcc-99d5299376d203fe5172574c2d6b0b088e532383.tar.gz
gcc-99d5299376d203fe5172574c2d6b0b088e532383.tar.bz2
[Vect] Fix mask check on Scatter loads/stores
Previously, IFN_MASK_SCATTER_STORE was used if 'loop_masks' was non-null, but the mask used is 'final_mask'. This caused a bug where a 'MASK_STORE' was vectorized into a 'SCATTER_STORE' instead of a 'MASK_SCATTER_STORE'. This fixes PR target/99102. gcc/ChangeLog: PR target/99102 * tree-vect-stmts.c (vectorizable_store): Fix scatter store mask check condition. (vectorizable_load): Fix gather load mask check condition. gcc/testsuite/ChangeLog: PR target/99102 * gcc.dg/vect/pr99102.c: New test.
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr99102.c20
-rw-r--r--gcc/tree-vect-stmts.c4
2 files changed, 22 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr99102.c b/gcc/testsuite/gcc.dg/vect/pr99102.c
new file mode 100644
index 0000000..9d321b9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr99102.c
@@ -0,0 +1,20 @@
+/* { dg-options "-O2 -ftree-vectorize" } */
+/* { dg-additional-options "-msve-vector-bits=256" { target aarch64_sve } } */
+long a[44];
+short d, e = -7;
+__attribute__((noipa)) void b(char f, short j, short k, unsigned l) {
+ for (int g = 0; g < 9; g += f)
+ for (int b = 0; b < 90; b -= k)
+ for (int h = 0; h < f; h++)
+ for (short i = 0; i < 15; i += 4)
+ if (!l)
+ a[i] = j;
+}
+int main() {
+ for (long c = 0; c < 2; ++c)
+ a[c] = 7;
+ b(9, d, e, 5);
+ if (!a[0])
+ __builtin_abort();
+}
+/* { dg-final { scan-tree-dump "MASK_SCATTER_STORE" "vect" { target aarch64_sve } } } */
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 85d3161..d791d3a 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -8126,7 +8126,7 @@ vectorizable_store (vec_info *vinfo,
{
tree scale = size_int (gs_info.scale);
gcall *call;
- if (loop_masks)
+ if (final_mask)
call = gimple_build_call_internal
(IFN_MASK_SCATTER_STORE, 5, dataref_ptr, vec_offset,
scale, vec_oprnd, final_mask);
@@ -9419,7 +9419,7 @@ vectorizable_load (vec_info *vinfo,
tree zero = build_zero_cst (vectype);
tree scale = size_int (gs_info.scale);
gcall *call;
- if (loop_masks)
+ if (final_mask)
call = gimple_build_call_internal
(IFN_MASK_GATHER_LOAD, 5, dataref_ptr,
vec_offset, scale, zero, final_mask);