No one has said anything in 48 hours.  By the power vested in me, I
declare it approved.

Pushed.

On Mon, Nov 29, 2021 at 5:21 PM Aldy Hernandez <al...@redhat.com> wrote:
>
> We're using a temporary range cache while computing ranges for PHIs to
> make sure the real cache doesn't get set until all PHIs are computed.
> With the ltrans beast in LTO mode this causes undue overhead.
>
> Since we already have a bitmap to indicate whether there's a cache
> entry, we can avoid the extra cache object by clearing it while PHIs
> are being calculated.
>
> Tested on x86-64 Linux.
>
> OK for trunk?
>
> gcc/ChangeLog:
>
>         PR tree-optimization/103409
>         * gimple-range-path.cc (path_range_query::compute_ranges_in_phis):
>         Do all the work with just one ssa_global_cache.
>         * gimple-range-path.h: Remove m_tmp_phi_cache.
> ---
>  gcc/gimple-range-path.cc | 23 +++++++++++------------
>  gcc/gimple-range-path.h  |  2 --
>  2 files changed, 11 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
> index b9c71226c1c..15ef72fd492 100644
> --- a/gcc/gimple-range-path.cc
> +++ b/gcc/gimple-range-path.cc
> @@ -375,30 +375,29 @@ void
>  path_range_query::compute_ranges_in_phis (basic_block bb)
>  {
>    int_range_max r;
> -  gphi_iterator iter;
> +  auto_bitmap phi_set;
>
>    // PHIs must be resolved simultaneously on entry to the block
>    // because any dependencies must be satistifed with values on entry.
>    // Thus, we calculate all PHIs first, and then update the cache at
>    // the end.
>
> -  m_tmp_phi_cache.clear ();
> -  for (iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
> +  for (auto iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
>      {
>        gphi *phi = iter.phi ();
>        tree name = gimple_phi_result (phi);
>
>        if (import_p (name) && range_defined_in_block (r, name, bb))
> -       m_tmp_phi_cache.set_global_range (name, r);
> -    }
> -  for (iter = gsi_start_phis (bb); !gsi_end_p (iter); gsi_next (&iter))
> -    {
> -      gphi *phi = iter.phi ();
> -      tree name = gimple_phi_result (phi);
> -
> -      if (m_tmp_phi_cache.get_global_range (r, name))
> -       set_cache (r, name);
> +       {
> +         unsigned v = SSA_NAME_VERSION (name);
> +         set_cache (r, name);
> +         bitmap_set_bit (phi_set, v);
> +         // Pretend we don't have a cache entry for this name until
> +         // we're done with all PHIs.
> +         bitmap_clear_bit (m_has_cache_entry, v);
> +       }
>      }
> +  bitmap_ior_into (m_has_cache_entry, phi_set);
>  }
>
>  // Compute ranges defined in the current block, or exported to the
> diff --git a/gcc/gimple-range-path.h b/gcc/gimple-range-path.h
> index 57a9ae9bdcd..77c92c07bc1 100644
> --- a/gcc/gimple-range-path.h
> +++ b/gcc/gimple-range-path.h
> @@ -82,8 +82,6 @@ private:
>    // Range cache for SSA names.
>    ssa_global_cache *m_cache;
>
> -  ssa_global_cache m_tmp_phi_cache;
> -
>    // Set for each SSA that has an active entry in the cache.
>    bitmap m_has_cache_entry;
>
> --
> 2.31.1
>

Reply via email to