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;
> +}

Reply via email to