On Mon, 14 Jul 2025, Richard Sandiford wrote: > Richard Biener <rguent...@suse.de> writes: > > 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. > > > > Bootstrap and regtest running on x86_64-unknown-linux-gnu. > > > > 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. > > Please could you revert this? It's not the right fix. The point of the > code is to opportunistically reuse loop masks that are needed by other > operations. It isn't supposed to record new loop masks itself.
Reverted. I'll try to find some cycles in the next day to test the alternative. Richard. > Like I say, replacing: > > if (loop_vinfo->scalar_cond_masked_set.contains ({ op0, 1 })) > > with: > > if (loop_vinfo->scalar_cond_masked_set.contains ({ op0, vec_num > })) > > fixed the bug for me. > > Thanks, > Richard > > > --- > > gcc/testsuite/gcc.dg/vect/pr121059.c | 24 ++++++++++++++++++++++++ > > gcc/tree-vect-stmts.cc | 10 ++++++++++ > > 2 files changed, 34 insertions(+) > > create mode 100644 gcc/testsuite/gcc.dg/vect/pr121059.c > > > > diff --git a/gcc/testsuite/gcc.dg/vect/pr121059.c > > b/gcc/testsuite/gcc.dg/vect/pr121059.c > > new file mode 100644 > > index 00000000000..d7f69b4f1f5 > > --- /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 4aa69da2218..f0dc4843ca7 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) > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman; HRB 36809 (AG Nuernberg)