https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126704

            Bug ID: 126704
           Summary: Missing or not complete global range after VRP2 (with
                    and without dom)
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
            Blocks: 85316, 126010
  Target Milestone: ---

Take:
```
int
Foo (int *p, int t)
{
  int i = *p;
  if (! (i <= 99999))
    __builtin_unreachable ();
  if (! (0 <= i && i <= 99999))
    __builtin_unreachable ();
  return i/10;
}

```

While working on changing tree_single_nonnegative_p over to use the ranger I
noticed this. This comes from `gcc.dg/pr80776-1.c` but changed to force the use
of the range after VRP2.

at -O2 at VRP2, the global range for the load will be `[-INF, 99999]` which is
what dom had set and is not updated afterwards.

With `-O2 -fno-tree-dominator-opts`, the global range will be gone.

This causes us not to notice that i is non-negative while expanding.
So the issue here is 2 fold, if we remove dom, we will remove sometimes partial
ranges but even those are partial ranges which is not updated by VRP2.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85316
[Bug 85316] [meta-bug] VRP range propagation missed cases
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126010
[Bug 126010] [meta-bug] Remove DOM

Reply via email to