Re: [PATCH] path solver: only compute ranges at the current path position [PR126876]

Richard Biener <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <CAFiYyc3U=i4zw1g0s3FUuwrhzAfMe4tWxAuxnX9HUeF3xHqUJQ@mail.gmail.com>
On Tue, Aug 18, 2026 at 12:30 PM Aldy Hernandez <[email protected]> wrote:
>
> Since r17-3298 the path ranger can become the current query while
> fold_using_range folds a statement, so match.pd simplifications can
> query with a context statement that can be from an arbitrary block on
> the path.  The solver's positional machinery is only meaningful at the
> block the walk is currently at.
>
> Only compute ranges at the current path position otherwise fall back
> to the global range.  Assert the positional invariant in
> range_defined_in_block, which I verified holds by testing the assert
> on a tree before r17-3298.
>
> Tested on ppc64le Linux.
>
> Pushed.
>
>         PR tree-optimization/126876
>
> gcc/ChangeLog:
>
>         * gimple-range-path.cc
>         (path_range_query::internal_range_of_expr): Only call
>         range_defined_in_block at the current path position.
>         (path_range_query::range_defined_in_block): Assert the current
>         path position.
> ---
>  gcc/gimple-range-path.cc | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
> index 467e321b8de..54c8a04b486 100644
> --- a/gcc/gimple-range-path.cc
> +++ b/gcc/gimple-range-path.cc
> @@ -156,7 +156,12 @@ path_range_query::internal_range_of_expr (vrange &r, tree name, gimple *stmt)
>        return true;
>      }
>
> +  // We can be called from match.pd or elsewhere, with a context statement
> +  // that can be anywhere on the path.  Since we can only compute ranges
> +  // mid flight at the current path position, check that's the case,
> +  // otherwise fall through to the global range.
>    if (stmt
> +      && gimple_bb (stmt) == curr_bb ()

Are there not in-BB side-effects to ranges that might or might not be reflected?

I'm not sure it's sensible to use path ranger as current query.

>        && range_defined_in_block (r, name, gimple_bb (stmt)))
>      {
>        if (TREE_CODE (name) == SSA_NAME)
> @@ -290,6 +295,11 @@ path_range_query::ssa_range_in_phi (vrange &r, gphi *phi)
>  bool
>  path_range_query::range_defined_in_block (vrange &r, tree name, basic_block bb)
>  {
> +  // Ranges can only be calculated at the current path position, both
> +  // while pre-computing the cache and when answering questions at the
> +  // path exit afterwards.
> +  gcc_assert (bb == curr_bb ());
> +
>    gimple *def_stmt = SSA_NAME_DEF_STMT (name);
>    basic_block def_bb = gimple_bb (def_stmt);
>
> --
> 2.47.3
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.