Re: [PATCH] Provide an API for ipa_vr.

2023-05-24 Thread Martin Jambor
Hello,

On Wed, May 17 2023, Aldy Hernandez wrote:
> This patch encapsulates the ipa_vr internals into an API.  It also
> makes it type agnostic, in preparation for upcoming changes to IPA.
>
> Interestingly, there's a 0.44% improvement to IPA-cp, which I'm sure
> we'll soak up with future changes in this area :).
>
> BTW, there's a note here:
> +  // vrange_storage is typeless, but we need to know what type of
> +  // range that is being streamed out (irange, frange, etc).  AFAICT,
> +  // there's no way to get at the underlying type by the time we
> +  // stream out in write_ipcp_transformation_info.
> +  tree m_type;
>
> Could someone more IPA savvy double check this is indeed the case?

Yes, that is true and keeping the type around in ipa_vr is probably
easier than postponing the deallocation of parameter descriptors
somehow.

>
> OK for trunk?

Yes, thanks.

Martin

>
> gcc/ChangeLog:
>
>   * ipa-cp.cc (ipa_value_range_from_jfunc): Use new ipa_vr API.
>   (ipcp_store_vr_results): Same.
>   * ipa-prop.cc (ipa_vr::ipa_vr): New.
>   (ipa_vr::get_vrange): New.
>   (ipa_vr::set_unknown): New.
>   (ipa_vr::streamer_read): New.
>   (ipa_vr::streamer_write): New.
>   (write_ipcp_transformation_info): Use new ipa_vr API.
>   (read_ipcp_transformation_info): Same.
>   (ipa_vr::nonzero_p): Delete.
>   (ipcp_update_vr): Use new ipa_vr API.
>   * ipa-prop.h (class ipa_vr): Provide an API and hide internals.
>   * ipa-sra.cc (zap_useless_ipcp_results): Use new ipa_vr API.
>   * gcc.dg/ipa/pr78121.c: Adjust for vrange::dump use.
>   * gcc.dg/ipa/vrp1.c: Same.
>   * gcc.dg/ipa/vrp2.c: Same.
>   * gcc.dg/ipa/vrp3.c: Same.
>   * gcc.dg/ipa/vrp4.c: Same.
>   * gcc.dg/ipa/vrp5.c: Same.
>   * gcc.dg/ipa/vrp6.c: Same.
>   * gcc.dg/ipa/vrp7.c: Same.
>   * gcc.dg/ipa/vrp8.c: Same.


Re: [PATCH] Provide an API for ipa_vr.

2023-05-22 Thread Aldy Hernandez via Gcc-patches
\\) 
> \\\[6," "cp" } } */
> -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\) 
> \\\[0, 999\\\]" "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\).* 
> \\\[6," "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\).* 
> \\\[0, 999\\\]" "cp" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp2.c b/gcc/testsuite/gcc.dg/ipa/vrp2.c
> index 31909bdbf24..b3ef9273891 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp2.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp2.c
> @@ -31,5 +31,5 @@ int main ()
>return 0;
>  }
>
> -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\) 
> \\\[4," "cp" } } */
> -/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\) 
> \\\[0, 11\\\]" "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\).* 
> \\\[4," "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range of param 0 \\(now 0\\).* 
> \\\[0, 11\\\]" "cp" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp3.c b/gcc/testsuite/gcc.dg/ipa/vrp3.c
> index 9b1dcf98b25..171f0341e18 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp3.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp3.c
> @@ -27,4 +27,4 @@ int main ()
>return 0;
>  }
>
> -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) \\\[0, 9\\\]" 2 "cp" } } */
> +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) .irange. int \\\[0, 9\\\]" 2 "cp" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp4.c b/gcc/testsuite/gcc.dg/ipa/vrp4.c
> index 941f80e00b2..d02b09f2c84 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp4.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp4.c
> @@ -24,5 +24,5 @@ int bar (struct st *s)
>foo (&s->b);
>  }
>
> -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" "cp" 
> } } */
>  /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp5.c b/gcc/testsuite/gcc.dg/ipa/vrp5.c
> index 571798dab51..6bbd3f16439 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp5.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp5.c
> @@ -30,5 +30,5 @@ int bar (struct st *s)
>foo (&arr2[1]);
>  }
>
> -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" "cp" 
> } } */
>  /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp6.c b/gcc/testsuite/gcc.dg/ipa/vrp6.c
> index 971db443442..03e7ab93363 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp6.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp6.c
> @@ -30,5 +30,5 @@ int bar (struct st *s)
>foo (&b);
>  }
>
> -/* { dg-final { scan-ipa-dump "Setting nonnull for 0" "cp" } } */
> +/* { dg-final { scan-ipa-dump "Setting value range.* \\\[1, \\+INF\\\]" "cp" 
> } } */
>  /* { dg-final { scan-tree-dump-times "if" 1 "vrp1" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp7.c b/gcc/testsuite/gcc.dg/ipa/vrp7.c
> index ca5aa29e975..471c622a537 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp7.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp7.c
> @@ -29,4 +29,4 @@ int main ()
>return 0;
>  }
>
> -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) \\\[-10, 9\\\]" 1 "cp" } } */
> +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) .irange. int \\\[-10, 9\\\]" 1 "cp" } } */
> diff --git a/gcc/testsuite/gcc.dg/ipa/vrp8.c b/gcc/testsuite/gcc.dg/ipa/vrp8.c
> index 0ac5fb5277d..a01ffbcc757 100644
> --- a/gcc/testsuite/gcc.dg/ipa/vrp8.c
> +++ b/gcc/testsuite/gcc.dg/ipa/vrp8.c
> @@ -39,4 +39,4 @@ main ()
>return 0;
>  }
>
> -/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) \\\[-10, 9\\\]" 1 "cp" } } */
> +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\(now 
> 0\\) .irange. int \\\[-10, 9\\\]" 1 "cp" } } */
> --
> 2.40.0
>
From 212fb0792c0c3de878647ffdb473191c0d3832c0 Mon Sep 17 00:00:00 2001
From: Aldy Hernandez 
Date: Wed, 17 May 2023 11:29:32 +0200
Subject: [PATCH] Provide an API for ipa_vr.

This patch encapsulates the ipa_vr internals into an API.  It al

[PATCH] Provide an API for ipa_vr.

2023-05-17 Thread Aldy Hernandez via Gcc-patches
This patch encapsulates the ipa_vr internals into an API.  It also
makes it type agnostic, in preparation for upcoming changes to IPA.

Interestingly, there's a 0.44% improvement to IPA-cp, which I'm sure
we'll soak up with future changes in this area :).

BTW, there's a note here:
+  // vrange_storage is typeless, but we need to know what type of
+  // range that is being streamed out (irange, frange, etc).  AFAICT,
+  // there's no way to get at the underlying type by the time we
+  // stream out in write_ipcp_transformation_info.
+  tree m_type;

Could someone more IPA savvy double check this is indeed the case?

OK for trunk?

gcc/ChangeLog:

* ipa-cp.cc (ipa_value_range_from_jfunc): Use new ipa_vr API.
(ipcp_store_vr_results): Same.
* ipa-prop.cc (ipa_vr::ipa_vr): New.
(ipa_vr::get_vrange): New.
(ipa_vr::set_unknown): New.
(ipa_vr::streamer_read): New.
(ipa_vr::streamer_write): New.
(write_ipcp_transformation_info): Use new ipa_vr API.
(read_ipcp_transformation_info): Same.
(ipa_vr::nonzero_p): Delete.
(ipcp_update_vr): Use new ipa_vr API.
* ipa-prop.h (class ipa_vr): Provide an API and hide internals.
* ipa-sra.cc (zap_useless_ipcp_results): Use new ipa_vr API.
* gcc.dg/ipa/pr78121.c: Adjust for vrange::dump use.
* gcc.dg/ipa/vrp1.c: Same.
* gcc.dg/ipa/vrp2.c: Same.
* gcc.dg/ipa/vrp3.c: Same.
* gcc.dg/ipa/vrp4.c: Same.
* gcc.dg/ipa/vrp5.c: Same.
* gcc.dg/ipa/vrp6.c: Same.
* gcc.dg/ipa/vrp7.c: Same.
* gcc.dg/ipa/vrp8.c: Same.
---
 gcc/ipa-cp.cc  |  22 ++---
 gcc/ipa-prop.cc| 129 -
 gcc/ipa-prop.h |  25 --
 gcc/ipa-sra.cc |   4 +-
 gcc/testsuite/gcc.dg/ipa/pr78121.c |   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp1.c|   4 +-
 gcc/testsuite/gcc.dg/ipa/vrp2.c|   4 +-
 gcc/testsuite/gcc.dg/ipa/vrp3.c|   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp4.c|   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp5.c|   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp6.c|   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp7.c|   2 +-
 gcc/testsuite/gcc.dg/ipa/vrp8.c|   2 +-
 13 files changed, 109 insertions(+), 93 deletions(-)

diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index 8cd0fa2cae7..d4b9d4ac27e 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -1947,13 +1947,11 @@ ipa_value_range_from_jfunc (ipa_node_params *info, 
cgraph_edge *cs,
 
   idx = ipa_get_jf_pass_through_formal_id (jfunc);
 
-  if (!(*sum->m_vr)[idx].known)
+  if (!(*sum->m_vr)[idx].known_p ())
return vr;
   tree vr_type = ipa_get_type (info, idx);
-  value_range srcvr (vr_type,
-(*sum->m_vr)[idx].min,
-(*sum->m_vr)[idx].max,
-(*sum->m_vr)[idx].type);
+  value_range srcvr;
+  (*sum->m_vr)[idx].get_vrange (srcvr, vr_type);
 
   enum tree_code operation = ipa_get_jf_pass_through_operation (jfunc);
 
@@ -6621,25 +6619,19 @@ ipcp_store_vr_results (void)
   for (unsigned i = 0; i < count; i++)
{
  ipcp_param_lattices *plats = ipa_get_parm_lattices (info, i);
- ipa_vr vr;
 
  if (!plats->m_value_range.bottom_p ()
  && !plats->m_value_range.top_p ()
  && dbg_cnt (ipa_cp_vr))
{
- tree min, max;
- vr.known = true;
- vr.type = get_legacy_range (plats->m_value_range.m_vr, min, max);
- vr.min = wi::to_wide (min);
- vr.max = wi::to_wide (max);
+ ipa_vr vr (plats->m_value_range.m_vr);
+ ts->m_vr->quick_push (vr);
}
  else
{
- vr.known = false;
- vr.type = VR_VARYING;
- vr.min = vr.max = wi::zero (INT_TYPE_SIZE);
+ ipa_vr vr;
+ ts->m_vr->quick_push (vr);
}
- ts->m_vr->quick_push (vr);
}
 }
 }
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index d7d70e5ec68..4ace410de49 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -56,6 +56,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "symtab-clones.h"
 #include "attr-fnspec.h"
 #include "gimple-range.h"
+#include "value-range-storage.h"
 
 /* Function summary where the parameter infos are actually stored. */
 ipa_node_params_t *ipa_node_params_sum = NULL;
@@ -177,6 +178,66 @@ struct ipa_cst_ref_desc
 static object_allocator ipa_refdesc_pool
   ("IPA-PROP ref descriptions");
 
+ipa_vr::ipa_vr ()
+  : m_storage (NULL),
+m_type (NULL)
+{
+}
+
+ipa_vr::ipa_vr (const vrange &r)
+  : m_storage (ggc_alloc_vrange_storage (r)),
+m_type (r.type ())
+{
+}
+
+void
+ipa_vr::get_vrange (vrange &r, tree type) const
+{
+  m_storage->get_vrange (r, type);
+}
+
+void
+ipa_vr::set_unknown ()
+{
+  if (m_storage)
+ggc_free (m_storage);
+
+  m_storage = NULL;
+}
+
+void
+ipa