Re: [PATCH] Provide an API for ipa_vr.
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.
\\) > \\\[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.
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