On Thu, Aug 3, 2023 at 4:34 AM Andrew Pinski via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > So I didn't expect valueization to cause calling gimple_nop_convert > to iterate between 2 different SSA names causing an infinite loop > in gimple_bitwise_inverted_equal_p. > So we should cause a bound on gimple_bitwise_inverted_equal_p calling > gimple_nop_convert and only look through one rather than always. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. > > gcc/ChangeLog: > > PR tree-optimization/110874 > * gimple-match-head.cc (gimple_bitwise_inverted_equal_p): > Add new argument, again with default value of true. > Don't try gimple_nop_convert if again is false. > Update call to gimple_bitwise_inverted_equal_p for > new argument. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/110874 > * gcc.c-torture/compile/pr110874-a.c: New test. > --- > gcc/gimple-match-head.cc | 14 +++++++++----- > .../gcc.c-torture/compile/pr110874-a.c | 17 +++++++++++++++++ > 2 files changed, 26 insertions(+), 5 deletions(-) > create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr110874-a.c > > diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc > index b1e96304d7c..e91aaab86dd 100644 > --- a/gcc/gimple-match-head.cc > +++ b/gcc/gimple-match-head.cc > @@ -273,7 +273,7 @@ gimple_bitwise_equal_p (tree expr1, tree expr2, tree > (*valueize) (tree)) > /* Helper function for bitwise_equal_p macro. */ > > static inline bool > -gimple_bitwise_inverted_equal_p (tree expr1, tree expr2, tree (*valueize) > (tree)) > +gimple_bitwise_inverted_equal_p (tree expr1, tree expr2, tree (*valueize) > (tree), bool again = true) > { > if (expr1 == expr2) > return false; > @@ -285,12 +285,16 @@ gimple_bitwise_inverted_equal_p (tree expr1, tree > expr2, tree (*valueize) (tree) > return false; > > tree other; > - if (gimple_nop_convert (expr1, &other, valueize) > - && gimple_bitwise_inverted_equal_p (other, expr2, valueize)) > + if (again > + && gimple_nop_convert (expr1, &other, valueize) > + && other != expr1 > + && gimple_bitwise_inverted_equal_p (other, expr2, valueize, false)) > return true; > > - if (gimple_nop_convert (expr2, &other, valueize) > - && gimple_bitwise_inverted_equal_p (expr1, other, valueize)) > + if (again > + && gimple_nop_convert (expr2, &other, valueize) > + && other != expr2 > + && gimple_bitwise_inverted_equal_p (expr1, other, valueize, false)) > return true;
Hmm, I don't think this tests all three relevant combinations? I think the way gimple_bitwise_equal_p handles this is better (not recursing). I'd split out the "tail" matching the BIT_NOT to another helper, I suppose that could even be a (match ...) pattern here. > if (TREE_CODE (expr1) != SSA_NAME > diff --git a/gcc/testsuite/gcc.c-torture/compile/pr110874-a.c > b/gcc/testsuite/gcc.c-torture/compile/pr110874-a.c > new file mode 100644 > index 00000000000..b314410a892 > --- /dev/null > +++ b/gcc/testsuite/gcc.c-torture/compile/pr110874-a.c > @@ -0,0 +1,17 @@ > +struct S1 { > + unsigned f0; > +}; > +static int g_161; > +void func_109(unsigned g_227, unsigned t) { > + struct S1 l_178; > + int l_160 = 0x1FAE99D5L; > + int *l_230[] = {&l_160}; > + if (l_160) { > + for (l_178.f0 = -7; l_178.f0;) { > + ++g_227; > + break; > + } > + (g_161) = g_227; > + } > + (g_161) &= t; > +} > -- > 2.31.1 >