I am testing the following patch on x86_64-unknown-linux-gnu. Test coverage for autovectorization of scatters seems rare.
Richard. This makes sure to get a truth type for scatter masks even when they are invariant. 2020-06-03 Richard Biener <rguent...@suse.de> PR tree-optimization/95487 * tree-vect-stmts.c (vectorizable_store): Use a truth type for the scatter mask. * g++.dg/vect/pr95487.cc: New testcase. --- gcc/testsuite/g++.dg/vect/pr95487.cc | 20 ++++++++++++++++++++ gcc/tree-vect-stmts.c | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/vect/pr95487.cc diff --git a/gcc/testsuite/g++.dg/vect/pr95487.cc b/gcc/testsuite/g++.dg/vect/pr95487.cc new file mode 100644 index 00000000000..34023d25572 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr95487.cc @@ -0,0 +1,20 @@ +// { dg-do compile } +// { dg-additional-options "-O3" } +// { dg-additional-options "-march=skylake-avx512" { target x86_64-*-* i?86-*-* } } + +int a; +bool d; +char e; +extern short f[]; +extern int g[]; +short j; +void h() { + for (short b = j; b < 0; b += 2) { + f[b] = 0; + if (d) { + for (char c = 0; c < a; c += 3) + e = 0; + g[b] = 0; + } + } +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 10f2e394b1e..26121dfa79c 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -7668,8 +7668,12 @@ vectorizable_store (vec_info *vinfo, gs_info.offset, stmt_info); if (mask) - mask_op = vec_mask = vect_get_vec_def_for_operand (vinfo, mask, - stmt_info); + { + tree mask_vectype = truth_type_for (vectype); + mask_op = vec_mask + = vect_get_vec_def_for_operand (vinfo, mask, + stmt_info, mask_vectype); + } } else if (modifier != NONE && (j & 1)) { -- 2.26.2