On October 13, 2020 5:17:48 PM GMT+02:00, Aldy Hernandez via Gcc-patches 
<gcc-patches@gcc.gnu.org> wrote:
>[Neither Andrew nor I are familiar with the SCEV code.  We treat it as
>a
>black box :).  So we could use a SCEV expert here.]
>
>In bounds_of_var_in_loop, evolution_part_in_loop_num is returning NULL:
>
>   step = evolution_part_in_loop_num (chrec, loop->num);

It means that Var doesn't vary in the loop. 
That is, chrec isn't a polynomial chrec. 

>and we ICE while trying to calculate the range for STEP.
>
>This is for:
>
>(gdb) dd stmt
>qx.0_3 = PHI <qx.0_1(3)>
>(gdb) dd var
>qx.0_3
>
>It looks like NULL is a perfectly valid response from
>evolution_part_in_loop_num.  Should we just bail if NULL?
>
>If bailing is the correct solution, the following patch fixes the PR
>and
>passes tests.
>
>Thanks.
>Aldy
>
>gcc/ChangeLog:
>
>       PR tree-optimization/97396
>       * vr-values.c (bounds_of_var_in_loop): Bail on no step.
>
>gcc/testsuite/ChangeLog:
>
>       * gcc.dg/pr97396.c: New test.
>---
> gcc/testsuite/gcc.dg/pr97396.c | 23 +++++++++++++++++++++++
> gcc/vr-values.c                |  2 ++
> 2 files changed, 25 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/pr97396.c
>
>diff --git a/gcc/testsuite/gcc.dg/pr97396.c
>b/gcc/testsuite/gcc.dg/pr97396.c
>new file mode 100644
>index 00000000000..d992c11f238
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/pr97396.c
>@@ -0,0 +1,23 @@
>+// { dg-do compile }
>+// { dg-options "-O1 -ftree-vrp" }
>+// { dg-additional-options "-m32" { target { i?86-*-* x86_64-*-* } } }
>+
>+unsigned int
>+po (char *os, unsigned int al)
>+{
>+  for (;;)
>+    {
>+      int qx = 0;
>+
>+      while (al < 1)
>+        {
>+          char *cw;
>+
>+          cw = os + qx;
>+          if (cw)
>+            return al + qx;
>+
>+          qx += sizeof *cw;
>+        }
>+    }
>+}
>diff --git a/gcc/vr-values.c b/gcc/vr-values.c
>index da0b249278b..16f6c629f29 100644
>--- a/gcc/vr-values.c
>+++ b/gcc/vr-values.c
>@@ -1827,6 +1827,8 @@ bounds_of_var_in_loop (tree *min, tree *max,
>range_query *query,
> 
>   init = initial_condition_in_loop_num (chrec, loop->num);
>   step = evolution_part_in_loop_num (chrec, loop->num);
>+  if (step == NULL_TREE)
>+    return false;
> 
>   /* If INIT is an SSA with a singleton range, set INIT to said
>      singleton, otherwise leave INIT alone.  */

Reply via email to