> Am 16.06.2023 um 16:23 schrieb Jakub Jelinek <ja...@redhat.com>: > > Hi! > > The following testcase ICEs, because I misremembered what the return value > from match_arith_overflow is. It isn't true if __builtin_*_overflow was > matched, but it is true only in the BIT_NOT_EXPR case if stmt was removed. > > So, if match_arith_overflow matches something, gsi_stmt (gsi) will not > be stmt and match_uaddc_usubc will be confused and can ICE. > > The following patch fixes it by checking if gsi_stmt (gsi) == stmt, > in that case we know it is still a PLUS_EXPR/MINUS_EXPR and we can try to > pattern match it further as UADDC/USUBC. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Ok Richard > 2023-06-16 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/110271 > * tree-ssa-math-opts.cc (math_opts_dom_walker::after_dom_children) > <case PLUS_EXPR>: Ignore return value from match_arith_overflow, > instead call match_uaddc_usubc only if gsi_stmt (gsi) is still stmt. > > * gcc.c-torture/compile/pr110271.c: New test. > > --- gcc/tree-ssa-math-opts.cc.jj 2023-06-15 09:12:28.777829348 +0200 > +++ gcc/tree-ssa-math-opts.cc 2023-06-16 10:44:31.231798664 +0200 > @@ -5558,9 +5558,12 @@ math_opts_dom_walker::after_dom_children > > case PLUS_EXPR: > case MINUS_EXPR: > - if (!convert_plusminus_to_widen (&gsi, stmt, code) > - && !match_arith_overflow (&gsi, stmt, code, m_cfg_changed_p)) > - match_uaddc_usubc (&gsi, stmt, code); > + if (!convert_plusminus_to_widen (&gsi, stmt, code)) > + { > + match_arith_overflow (&gsi, stmt, code, m_cfg_changed_p); > + if (gsi_stmt (gsi) == stmt) > + match_uaddc_usubc (&gsi, stmt, code); > + } > break; > > case BIT_NOT_EXPR: > --- gcc/testsuite/gcc.c-torture/compile/pr110271.c.jj 2023-06-16 > 10:57:32.757621687 +0200 > +++ gcc/testsuite/gcc.c-torture/compile/pr110271.c 2023-06-16 > 10:57:15.298871335 +0200 > @@ -0,0 +1,24 @@ > +/* PR tree-optimization/110271 */ > + > +unsigned a, b, c, d, e; > + > +void > +foo (unsigned *x, int y, unsigned int *z) > +{ > + for (int i = 0; i < y; i++) > + { > + b += d; > + a += b < d; > + a += c = (__PTRDIFF_TYPE__) x > 3; > + d = z[1] + (a < c); > + a += e; > + d += a < e; > + } > +} > + > +void > +bar (unsigned int *z) > +{ > + unsigned *x = x; > + foo (x, 9, z); > +} > > Jakub >
Re: [PATCH] tree-ssa-math-opts: Fix up uaddc/usubc pattern matching [PR110271]
Richard Biener via Gcc-patches Fri, 16 Jun 2023 10:04:24 -0700
- [PATCH] tree-ssa-math-opts: Fix up uaddc/us... Jakub Jelinek via Gcc-patches
- Re: [PATCH] tree-ssa-math-opts: Fix up... Richard Biener via Gcc-patches