On Mon, Sep 18, 2023 at 11:04:16AM +0200, Richard Biener via Gcc-patches wrote: > > Note genmatch should warn (or error out) if this gets detected so I filed > > PR 111446 > > which I will be looking into next week or the week after so we don't run > > into > > this issue again. > > > > PR tree-optimization/111442 > > > > gcc/ChangeLog: > > > > * match.pd (zero_one_valued_p): Have the bit_and match not be > > recusive.
s/recusive/recursive/g s/recusion/recursion/g > > diff --git a/gcc/match.pd b/gcc/match.pd > > index 887665633d4..773c3810f51 100644 > > --- a/gcc/match.pd > > +++ b/gcc/match.pd > > @@ -2183,8 +2183,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > > > > /* (a&1) is always [0,1] too. This is useful again when > > the range is not known. */ > > +/* Note this can't be recusive due to VN handling of equivalents, > > + VN and would cause an infinite recusion. */ > > (match zero_one_valued_p > > - (bit_and:c@0 @1 zero_one_valued_p)) > > + (bit_and:c@0 @1 integer_onep) > > + (if (INTEGRAL_TYPE_P (type)))) > > > > /* A conversion from an zero_one_valued_p is still a [0,1]. > > This is useful when the range of a variable is not known */ > > diff --git a/gcc/testsuite/gcc.c-torture/compile/pr111442-1.c > > b/gcc/testsuite/gcc.c-torture/compile/pr111442-1.c > > new file mode 100644 > > index 00000000000..5814ee938de > > --- /dev/null > > +++ b/gcc/testsuite/gcc.c-torture/compile/pr111442-1.c > > @@ -0,0 +1,13 @@ > > + > > +int *a, b; > > +int main() { > > + int d = 1, e; > > + if (d) > > + e = a ? 0 % 0 : 0; > > + if (d) > > + a = &d; > > + d = -1; > > + b = d & e; > > + b = 2 * e ^ 1; > > + return 0; > > +} > > -- > > 2.31.1 > > Jakub