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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Aldy Hernandez <al...@gcc.gnu.org>:

https://gcc.gnu.org/g:18546941ae4c56cd9240d2dc2ca2806e01eb6fb7

commit r12-5000-g18546941ae4c56cd9240d2dc2ca2806e01eb6fb7
Author: Aldy Hernandez <al...@redhat.com>
Date:   Mon Nov 8 12:13:33 2021 +0100

    path solver: Avoid recalculating ranges already in the cache.

    The problem here is an ordering issue with a path that starts
    with 19->3:

     <bb 3> [local count: 916928331]:
      # value_20 = PHI <value_17(19), value_7(D)(17)>
      # n_27 = PHI <n_16(19), 1(17)>
      n_16 = n_27 + 4;
      value_17 = value_20 / 10000;
      if (value_20 > 42949672959999)
        goto <bb 19>; [89.00%]
      else
        goto <bb 4>; [11.00%]

    The problem here is that both value_17 and value_20 are in the set of
    imports we must pre-calculate.  The value_17 name occurs first in the
    bitmap, so we try to resolve it first, which causes us to recursively
    solve the value_20 range.  We do so correctly and put them both in the
    cache.  However, when we try to solve value_20 from the bitmap, we
    ignore that it already has a cached entry and try to resolve the PHI
    with the wrong value of value_17:

      # value_20 = PHI <value_17(19), value_7(D)(17)>

    The right thing to do is to avoid recalculating definitions already
    solved.

    Regstrapped and checked for # threads before and after on x86-64 Linux.

    gcc/ChangeLog:

            PR tree-optimization/103120
            * gimple-range-path.cc (path_range_query::range_defined_in_block):
            Bail if there's a cache entry.

    gcc/testsuite/ChangeLog:

            * gcc.dg/pr103120.c: New test.

Reply via email to