Hello, I believe all questions regarding the patch below have been answered and so I would like to ping it.
Thanks, Martin On Tue, Nov 05 2024, Martin Jambor wrote: > Hi, > > when inlining (during the analysis phase) a call graph edge, we update > all pass-through jump functions corresponding to edges going out of > the newly inlined function to be relative to the function into which > we are inlining or to expose the information originally captured for > the edge that is being inlined. > > Similarly, we can combine the value range information in pass-through > jump functions corresponding to both edges, which is what this patch > adds - at least for the case when the inlined pass-through is a > simple, non-arithmetic one, which is the case that we also handle for > constant and aggregate jump function parts. > > Bootstrapped and tested on x86_64-linux, the whole patch series has > additionally passed LTO and profiled-LTO bootstrap on the same platform > and a bootstrap and testsuite on ppc64-linux. Aarch64-linux bootstrap > and testing is in progress. OK for master is that passes too? > > Thanks, > > Martin > > > gcc/ChangeLog: > > 2024-11-01 Martin Jambor <mjam...@suse.cz> > > * ipa-cp.h: Forward declare class ipa_vr. > (ipa_vr_operation_and_type_effects) Declare. > * ipa-cp.cc (ipa_vr_operation_and_type_effects): Make public. > * ipa-prop.cc (update_jump_functions_after_inlining): Also update > value range jump functions. > --- > gcc/ipa-cp.cc | 4 ++-- > gcc/ipa-cp.h | 13 +++++++++++++ > gcc/ipa-prop.cc | 18 ++++++++++++++++++ > 3 files changed, 33 insertions(+), 2 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index fa4f0feeb8d..92dd2af19e0 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1644,7 +1644,7 @@ ipa_context_from_jfunc (ipa_node_params *info, > cgraph_edge *cs, int csidx, > DST_TYPE on value range in SRC_VR and store it to DST_VR. Return true if > the result is a range that is not VARYING nor UNDEFINED. */ > > -static bool > +bool > ipa_vr_operation_and_type_effects (vrange &dst_vr, > const vrange &src_vr, > enum tree_code operation, > @@ -1670,7 +1670,7 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, > /* Same as above, but the SRC_VR argument is an IPA_VR which must > first be extracted onto a vrange. */ > > -static bool > +bool > ipa_vr_operation_and_type_effects (vrange &dst_vr, > const ipa_vr &src_vr, > enum tree_code operation, > diff --git a/gcc/ipa-cp.h b/gcc/ipa-cp.h > index ba2ebfede63..4f569c1ee83 100644 > --- a/gcc/ipa-cp.h > +++ b/gcc/ipa-cp.h > @@ -299,4 +299,17 @@ ipa_vr_supported_type_p (tree type) > return irange::supports_p (type) || prange::supports_p (type); > } > > +class ipa_vr; > + > +bool ipa_vr_operation_and_type_effects (vrange &dst_vr, > + const vrange &src_vr, > + enum tree_code operation, > + tree dst_type, tree src_type); > +bool ipa_vr_operation_and_type_effects (vrange &dst_vr, > + const ipa_vr &src_vr, > + enum tree_code operation, > + tree dst_type, tree src_type); > + > + > + > #endif /* IPA_CP_H */ > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index 012f8a32386..3b24bcbed15 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -3486,6 +3486,24 @@ update_jump_functions_after_inlining (struct > cgraph_edge *cs, > gcc_unreachable (); > } > > + if (src->m_vr && src->m_vr->known_p ()) > + { > + value_range svr (src->m_vr->type ()); > + if (!dst->m_vr || !dst->m_vr->known_p ()) > + ipa_set_jfunc_vr (dst, *src->m_vr); > + else if (ipa_vr_operation_and_type_effects (svr, *src->m_vr, > + NOP_EXPR, > + dst->m_vr->type (), > + src->m_vr->type ())) > + { > + value_range dvr; > + dst->m_vr->get_vrange (dvr); > + dvr.intersect (svr); > + if (!dvr.undefined_p ()) > + ipa_set_jfunc_vr (dst, dvr); > + } > + } > + > if (src->agg.items > && (dst_agg_p || !src->agg.by_ref)) > { > -- > 2.47.0