From 887c45fb5b047171e82710baa51108d5c210eb42 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 3 Jun 2020 15:51:29 +0200 Subject: [PATCH] tree-optimization/95487 - use a truth type for scatter masks This makes sure to get a truth type for scatter masks even when they are invariant. 2020-06-03 Richard Biener 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 a6c7f333fc7..5548f0d987f 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -7676,8 +7676,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.30.2