aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-01-04 13:25:35 +0100
committerRichard Biener <rguenther@suse.de>2021-01-04 14:39:14 +0100
commit9e79d76a16c56df0f838b9aede69c0a158203f56 (patch)
tree0b8b0c9b7dc9c60f8847961949c0e19f50bdb257 /gcc
parent24cd9afe617a39801d190418cf3fbab3bc3742a7 (diff)
downloadgcc-9e79d76a16c56df0f838b9aede69c0a158203f56.zip
gcc-9e79d76a16c56df0f838b9aede69c0a158203f56.tar.gz
gcc-9e79d76a16c56df0f838b9aede69c0a158203f56.tar.bz2
tree-optimization/98308 - set vector type for mask of masked load
This makes sure to set the vector type on an invariant mask argument for a masked load and SLP. 2021-01-04 Richard Biener <rguenther@suse.de> PR tree-optimization/98308 * tree-vect-stmts.c (vectorizable_load): Set invariant mask SLP vectype. * gcc.dg/vect/pr98308.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr98308.c16
-rw-r--r--gcc/tree-vect-stmts.c11
2 files changed, 27 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr98308.c b/gcc/testsuite/gcc.dg/vect/pr98308.c
new file mode 100644
index 0000000..7d717b1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr98308.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+/* { dg-additional-options "-march=skylake-avx512" { target avx512f } } */
+
+extern unsigned long long int arr_86[];
+extern unsigned long long int arr_87[][15];
+
+void test(_Bool a, unsigned short c[][15], unsigned char d[])
+{
+ for (short h = 0; h < 10; h++)
+ for (char i = 0; i < 15; i += 2)
+ {
+ arr_86[0] = d[0];
+ arr_87[h][0] = a ? c[h][i] : 0;
+ }
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 9e94675..54fb68b 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -8563,6 +8563,17 @@ vectorizable_load (vec_info *vinfo,
if (!vec_stmt) /* transformation not required. */
{
+ if (slp_node
+ && mask
+ && !vect_maybe_update_slp_op_vectype (SLP_TREE_CHILDREN (slp_node)[0],
+ mask_vectype))
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "incompatible vector types for invariants\n");
+ return false;
+ }
+
if (!slp)
STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info) = memory_access_type;