On Fri, Dec 27, 2024 at 2:27 AM Lewis Hyatt <lhy...@gmail.com> wrote: > > Hello- > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118205 > > The PR shows that on some code involving indexing into a zero-length array > in a loop, we try to look up in reduction_phi() a statement that is not a > PHI. Since r15-6001, that asserts, whereas it used to return NULL, so this > patch restores the previous behavior for that case. Tested on x86-64 and > aarch64 with no issues. Does it look OK please? Thanks!
OK. Thanks, Richard. > -Lewis > > -- >8 -- > > Prior to r15-6001, reduction_phi() could be called with the PHI parameter > not actually being a gphi*. The search through reduction_list would fail and > return NULL. r15-6001 added a requirement that PHI actually be a gphi*, but > did not add a check for this. The PR shows an example where the check is > needed; fix by explicitly returning NULL in this case. > > gcc/ChangeLog: > > PR tree-optimization/118205 > * tree-parloops.cc (reduction_phi): Return NULL if PHI parameter is > not a phi node. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/118205 > * c-c++-common/pr118205.c: New test. > --- > gcc/tree-parloops.cc | 2 +- > gcc/testsuite/c-c++-common/pr118205.c | 25 +++++++++++++++++++++++++ > 2 files changed, 26 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/c-c++-common/pr118205.c > > diff --git a/gcc/tree-parloops.cc b/gcc/tree-parloops.cc > index 8427c287a6a..42183297399 100644 > --- a/gcc/tree-parloops.cc > +++ b/gcc/tree-parloops.cc > @@ -948,7 +948,7 @@ reduction_phi (reduction_info_table_type *reduction_list, > gimple *phi) > { > struct reduction_info tmpred, *red; > > - if (reduction_list->is_empty () || phi == NULL) > + if (reduction_list->is_empty () || phi == NULL || !is_a <gphi *> (phi)) > return NULL; > > if (gimple_uid (phi) == (unsigned int)-1 > diff --git a/gcc/testsuite/c-c++-common/pr118205.c > b/gcc/testsuite/c-c++-common/pr118205.c > new file mode 100644 > index 00000000000..c98f8d84a1b > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/pr118205.c > @@ -0,0 +1,25 @@ > +/* PR tree-optimization/118205 */ > + > +/* { dg-do compile } */ > +/* { dg-require-effective-target fgraphite } */ > +/* { dg-require-effective-target pthread } */ > +/* { dg-options "-O -floop-parallelize-all -ftree-parallelize-loops=2" } */ > + > +int x; > +void g(int); > +int f() { > + unsigned res = 0; > + int arr[] = {}; > + int y = 0; > + for (unsigned int i = 1; i; i++) > + { > + for (int n = 0; n < 2; n++) > + { > + g(arr[i]); > + res = y > x ? y : x; > + y = res; > + } > + g(arr[i]); > + } > + return res; > +}