summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-07-14 14:09:28 +0200
committerRichard Biener <rguenther@suse.de>2025-10-31 14:56:31 +0100
commit2f7e5a368ca71db5e268091e6b74506de32963bd (patch)
tree1dd164d7152508ad34e26ee4169f20b95e8179bd
parent7dde99394cec91956a44934b5d6075d7e85f86d6 (diff)
tree-optimization/121059 - fixup loop mask query
When we opportunistically mask an operand of a AND with an already available loop mask we need to query that set with the correct number of masks we expect. PR tree-optimization/121059 * tree-vect-stmts.cc (vectorizable_operation): Query scalar_cond_masked_set with the correct number of masks. * gcc.dg/vect/pr121059.c: New testcase. Co-Authored-By: Richard Sandiford <richard.sandiford@arm.com> (cherry picked from commit 234f122a9be5cc2a30d2a9e94c2fc9cde1d5a64d)
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr121059.c24
-rw-r--r--gcc/tree-vect-stmts.cc11
2 files changed, 30 insertions, 5 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr121059.c b/gcc/testsuite/gcc.dg/vect/pr121059.c
new file mode 100644
index 00000000000..2bbfcead86d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr121059.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3 --param vect-partial-vector-usage=1" } */
+/* { dg-additional-options "-march=x86-64-v4" { target avx512f } } */
+
+typedef struct {
+ long left, right, top, bottom;
+} MngBox;
+typedef struct {
+ MngBox object_clip[6];
+ char exists[256], frozen[];
+} MngReadInfo;
+MngReadInfo mng_info;
+
+long ReadMNGImage_i;
+
+void ReadMNGImage(int ReadMNGImage_i)
+{
+ for (; ReadMNGImage_i < 256; ReadMNGImage_i++)
+ if (mng_info.exists[ReadMNGImage_i] && mng_info.frozen[ReadMNGImage_i])
+ mng_info.object_clip[ReadMNGImage_i].left =
+ mng_info.object_clip[ReadMNGImage_i].right =
+ mng_info.object_clip[ReadMNGImage_i].top =
+ mng_info.object_clip[ReadMNGImage_i].bottom = 0;
+}
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 52face23c10..16fb8faf1d1 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -6170,7 +6170,8 @@ vectorizable_operation (vec_info *vinfo,
poly_uint64 nunits_in;
poly_uint64 nunits_out;
tree vectype_out;
- int ncopies, vec_num;
+ unsigned int ncopies;
+ unsigned vec_num;
int i;
vec<tree> vec_oprnds0 = vNULL;
vec<tree> vec_oprnds1 = vNULL;
@@ -6626,8 +6627,8 @@ vectorizable_operation (vec_info *vinfo,
&& code == BIT_AND_EXPR
&& VECTOR_BOOLEAN_TYPE_P (vectype))
{
- if (loop_vinfo->scalar_cond_masked_set.contains ({ op0,
- ncopies}))
+ if (loop_vinfo->scalar_cond_masked_set.contains
+ ({ op0, vec_num * ncopies}))
{
mask = vect_get_loop_mask (gsi, masks, vec_num * ncopies,
vectype, i);
@@ -6636,8 +6637,8 @@ vectorizable_operation (vec_info *vinfo,
vop0, gsi);
}
- if (loop_vinfo->scalar_cond_masked_set.contains ({ op1,
- ncopies }))
+ if (loop_vinfo->scalar_cond_masked_set.contains
+ ({ op1, vec_num * ncopies }))
{
mask = vect_get_loop_mask (gsi, masks, vec_num * ncopies,
vectype, i);