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

            Bug ID: 91789
           Summary: Value ranges determined from comparisons not used
                    transitively
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: drepper.fsp+rhbz at gmail dot com
  Target Milestone: ---

Take the following code:

int foo(int a, int b)
{
  if (b < a)
    __builtin_unreachable();
  if (a < 0)
    return -1;
  if (b < 0)
    return 0;
  return 1;
}

The compiler should be able to determine that the b < 0 can never be true.  At
that point in the code a >= 0 and b >= a, therefore transitively b >= 0.


The problem is not tied to __builtin_unreachable as can be seen by changing the
code slightly:

int foo(int a, int b)
{
  if (b < a)
    return 2;
  if (a < 0)
    return -1;
  if (b < 0)
    return 0;
  return 1;
}

After the initial test b < a is handled there is still a threeway comparison.

The problem can be seen with 9.2.1 as well as the current trunk version.  clang
8.0.0 generates pretty much the same code as gcc.

Reply via email to