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!

-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