On Fri, 10 Jan 2025, Alexandre Oliva wrote: > > There was a cut&pasto in the rr_and_mask's adjustment to match the > combined type: the test on whether there was a mask already was > testing the wrong variable, and then it might crash or otherwise fail > accessing an undefined mask. This only hit with checking enabled, > and rarely at that. > > Regstrapped on x86_64-linux-gnu. Ok to install?
OK. Richard. > > for gcc/ChangeLog > > PR tree-optimization/118344 > * gimple-fold.cc (fold_truth_andor_for_ifcombine): Fix typo in > rr_and_mask's type adjustment test. > > for gcc/testsuite/ChangeLog > > PR tree-optimization/118344 > * gcc.dg/field-merge-19.c: New. > --- > gcc/gimple-fold.cc | 2 +- > gcc/testsuite/gcc.dg/field-merge-19.c | 41 > +++++++++++++++++++++++++++++++++ > 2 files changed, 42 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/field-merge-19.c > > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc > index 0ad92de3a218f..20b5024d861db 100644 > --- a/gcc/gimple-fold.cc > +++ b/gcc/gimple-fold.cc > @@ -8644,7 +8644,7 @@ fold_truth_andor_for_ifcombine (enum tree_code code, > tree truth_type, > xlr_bitpos); > else > lr_mask = wi::shifted_mask (xlr_bitpos, lr_bitsize, false, rnprec); > - if (rl_and_mask.get_precision ()) > + if (rr_and_mask.get_precision ()) > rr_mask = wi::lshift (wide_int::from (rr_and_mask, rnprec, UNSIGNED), > xrr_bitpos); > else > diff --git a/gcc/testsuite/gcc.dg/field-merge-19.c > b/gcc/testsuite/gcc.dg/field-merge-19.c > new file mode 100644 > index 0000000000000..5622baa52b0a3 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/field-merge-19.c > @@ -0,0 +1,41 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -fchecking" } */ > + > +/* PR tree-optimization/118344 */ > + > +/* This used to ICE attempting to extend a mask variable after testing the > + wrong mask variable. */ > + > +int d, e, g, h, i, c, j; > +static short k; > +char o; > +static int *p; > +static long *a; > +int b[0]; > +int q(int s, int t, int *u, int *v) { > + for (int f = 0; f < s; f++) > + if ((t & v[f]) != u[f]) > + return 0; > + return 1; > +} > +int w(int s, int t) { > + int l[] = {t, t, t, t}, m[] = {e, e, 3, 1}; > + int n = q(s, d, l, m); > + return n; > +} > +int x(unsigned s) { > + unsigned r; > + if (s >= -1) > + return 1; > + r = 10000000; > + while (s > 1 / r) > + r /= 2; > + return g ? 2 : 0; > +} > +void y() { > + for (;;) { > + b[w(8, *p)] = h; > + for (; a + k; j = o) > + i &= c = x(6) < 0; > + } > +} > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)