On Tue, Nov 11, 2025 at 1:53 AM Andrew Pinski <[email protected]> wrote: > > So factor_out_operators will factor out some expressions but in the case > of BIT_FIELD_REF and BIT_INSERT_EXPR, this only allowed for operand 0 as the > other operands need to be constant. > > Bootstrapped and tested on x86_64-linux-gnu.
OK. Richard. > PR tree-optimization/122629 > > gcc/ChangeLog: > > * tree-if-conv.cc (factor_out_operators): Reject > BIT_FIELD_REF and BIT_INSERT_EXPR if operand other > than 0 is different. > > gcc/testsuite/ChangeLog: > > * gcc.dg/torture/pr122629-1.c: New test. > * gcc.dg/torture/pr122629-2.c: New test. > * gcc.dg/tree-ssa/pr122629-1.c: New test. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/testsuite/gcc.dg/torture/pr122629-1.c | 28 +++++++++++++++++ > gcc/testsuite/gcc.dg/torture/pr122629-2.c | 32 +++++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr122629-1.c | 36 ++++++++++++++++++++++ > gcc/tree-if-conv.cc | 8 +++++ > 4 files changed, 104 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/torture/pr122629-1.c > create mode 100644 gcc/testsuite/gcc.dg/torture/pr122629-2.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr122629-1.c > > diff --git a/gcc/testsuite/gcc.dg/torture/pr122629-1.c > b/gcc/testsuite/gcc.dg/torture/pr122629-1.c > new file mode 100644 > index 00000000000..47936e7896e > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr122629-1.c > @@ -0,0 +1,28 @@ > +/* { dg-do compile } */ > +/* PR tree-optimization/122629 */ > + > +/* factor_out_operators was factoring out BIT_FIELD_REF and BIT_INSERT_EXPR, > + both which requires constant operands so it would not valid to factor. */ > + > +typedef int ix4 __attribute__((vector_size(4*sizeof(int)))); > + > +int f(ix4 *a, int l, int *b) > +{ > + for (int i =0 ;i < l; i++) > + { > + int t; > + ix4 tt = a[i]; > + if(*b) t = tt[1]; else t = tt[0]; > + *b = t; > + } > +} > + > +int g(ix4 *a, int l, int *b) > +{ > + for (int i =0 ;i < l; i++) > + { > + ix4 tt = a[i]; > + if(*b) tt[1] = 1; else tt[0] = 1; > + *a = tt; > + } > +} > diff --git a/gcc/testsuite/gcc.dg/torture/pr122629-2.c > b/gcc/testsuite/gcc.dg/torture/pr122629-2.c > new file mode 100644 > index 00000000000..1ade7b9f742 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/torture/pr122629-2.c > @@ -0,0 +1,32 @@ > +/* { dg-do compile } */ > +/* PR tree-optimization/122629 */ > + > +typedef int ix4 __attribute__((vector_size(4*sizeof(int)))); > + > +int f(ix4 *a, int l, int *b, ix4 *c) > +{ > + for (int i =0 ;i < l; i++) > + { > + int t; > + ix4 tt = a[i]; > + ix4 tt1 = c[i]; > + if(*b) t = tt1[0]; else t = tt[0]; > + *b = t; > + } > +} > + > +int g(ix4 *a, int l, int *b, ix4 *c) > +{ > + for (int i =0 ;i < l; i++) > + { > + ix4 tt = a[i]; > + ix4 tt1 = c[i]; > + if(*b) { > + tt = tt1; > + tt[0] = 1; > + } else { > + tt[0] = 1; > + } > + a[i] = tt; > + } > +} > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr122629-1.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr122629-1.c > new file mode 100644 > index 00000000000..a80d4a1990b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr122629-1.c > @@ -0,0 +1,36 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-ifcvt-details" } */ > +/* PR tree-optimization/122629 */ > + > +typedef int ix4 __attribute__((vector_size(4*sizeof(int)))); > + > +int f(ix4 *a, int l, int *b, ix4 *c) > +{ > + for (int i =0 ;i < l; i++) > + { > + int t; > + ix4 tt = a[i]; > + ix4 tt1 = c[i]; > + if(*b) t = tt1[0]; else t = tt[0]; > + *b = t; > + } > +} > + > +int g(ix4 *a, int l, int *b, ix4 *c) > +{ > + for (int i =0 ;i < l; i++) > + { > + ix4 tt = a[i]; > + ix4 tt1 = c[i]; > + if(*b) { > + tt = tt1; > + tt[0] = 1; > + } else { > + tt[0] = 1; > + } > + a[i] = tt; > + } > +} > + > +/* Make sure BIT_INSERT_EXPR/BIT_FIELD_REF is still factored out for the > case if operand 0 is different. */ > +/* { dg-final { scan-tree-dump-times "changed to factor operation out from" > 2 "ifcvt" } } */ > diff --git a/gcc/tree-if-conv.cc b/gcc/tree-if-conv.cc > index 0bb3de9b137..bb30c4fb35f 100644 > --- a/gcc/tree-if-conv.cc > +++ b/gcc/tree-if-conv.cc > @@ -2245,6 +2245,14 @@ again: > if (opnum == -1) > return; > > + /* BIT_FIELD_REF and BIT_INSERT_EXPR can't be factored out for non-0 > operands > + as the other operands require constants. */ > + if ((arg1_op.code == BIT_FIELD_REF > + || arg1_op.code == BIT_INSERT_EXPR) > + && opnum != 0) > + return; > + > + > if (!types_compatible_p (TREE_TYPE (new_arg0), TREE_TYPE (new_arg1))) > return; > tree new_res = make_ssa_name (TREE_TYPE (new_arg0), NULL); > -- > 2.43.0 >
