https://gcc.gnu.org/g:66346b6d800fc4baae876e0fe4e932401bcc85fa

commit r16-2236-g66346b6d800fc4baae876e0fe4e932401bcc85fa
Author: Richard Biener <rguent...@suse.de>
Date:   Mon Jul 14 14:09:28 2025 +0200

    tree-optimization/121059 - record loop mask when required
    
    For loop masking we need to mask a mask AND operation with the loop
    mask.  The following makes sure we have a corresponding mask
    available.  There's no good way to distinguish loop masking from
    len masking here, so assume we have recorded a mask for the operands
    mask producers.
    
            PR tree-optimization/121059
            * tree-vect-stmts.cc (vectorizable_operation): Record a
            loop mask for mask AND operations.
    
            * gcc.dg/vect/pr121059.c: New testcase.

Diff:
---
 gcc/testsuite/gcc.dg/vect/pr121059.c | 24 ++++++++++++++++++++++++
 gcc/tree-vect-stmts.cc               | 10 ++++++++++
 2 files changed, 34 insertions(+)

diff --git a/gcc/testsuite/gcc.dg/vect/pr121059.c 
b/gcc/testsuite/gcc.dg/vect/pr121059.c
new file mode 100644
index 000000000000..2bbfcead86da
--- /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 4aa69da2218b..f0dc4843ca78 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -6978,6 +6978,16 @@ vectorizable_operation (vec_info *vinfo,
              LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) = false;
            }
        }
+      else if (loop_vinfo
+              && LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
+              && code == BIT_AND_EXPR
+              && VECTOR_BOOLEAN_TYPE_P (vectype)
+              /* We cannot always record a mask since that will disable
+                 len-based partial vectors, but there should be already
+                 one mask producer stmt which should require loop
+                 masking.  */
+              && !masks->is_empty ())
+       vect_record_loop_mask (loop_vinfo, masks, vec_num, vectype, NULL);
 
       /* Put types on constant and invariant SLP children.  */
       if (!vect_maybe_update_slp_op_vectype (slp_op0, vectype)

Reply via email to