Message ID | 20240428200959.1249849-1-aldyh@redhat.com |
---|---|
State | New |
Headers | show |
Series | Minor range type fixes for IPA in preparation for prange. | expand |
PING. I can probably commit this patchlet as a ranger maintainer, but I'd prefer a nod from a global or IPA maintainer. It is the one patch that's needed before I can throw the switch on prange support later this week. Thanks. Aldy On Sun, Apr 28, 2024 at 10:10 PM Aldy Hernandez <aldyh@redhat.com> wrote: > > The polymorphic Value_Range object takes a tree type at construction > so it can determine what type of range to use (currently irange or > frange). It seems a few of the types are slightly off. This isn't a > problem now, because IPA only cares about integers and pointers, which > can both live in an irange. However, with prange coming about, we > need to get the type right, because you can't store an integer in a > pointer range or vice versa. > > Also, in preparation for prange, the irange::supports_p() idiom will become: > > irange::supports_p () || prange::supports_p() > > To avoid changing all these palces, I've added an inline function we > can later change and change everything at once. > > Finally, there's a Value_Range::supports_type_p() && > irange::supports_p() in the code. The latter is a subset of the > former, so there's no need to check both. > > OK for trunk? > > gcc/ChangeLog: > > * ipa-cp.cc (ipa_vr_operation_and_type_effects): Use ipa_supports_p. > (ipa_value_range_from_jfunc): Change Value_Range type. > (propagate_vr_across_jump_function): Same. > * ipa-cp.h (ipa_supports_p): New. > * ipa-fnsummary.cc (evaluate_conditions_for_known_args): Change Value_Range type. > * ipa-prop.cc (ipa_compute_jump_functions_for_edge): Use ipa_supports_p. > (ipcp_get_parm_bits): Same. > --- > gcc/ipa-cp.cc | 14 +++++++------- > gcc/ipa-cp.h | 8 ++++++++ > gcc/ipa-fnsummary.cc | 2 +- > gcc/ipa-prop.cc | 8 +++----- > 4 files changed, 19 insertions(+), 13 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index a688dced5c9..5781f50c854 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1649,7 +1649,7 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, > enum tree_code operation, > tree dst_type, tree src_type) > { > - if (!irange::supports_p (dst_type) || !irange::supports_p (src_type)) > + if (!ipa_supports_p (dst_type) || !ipa_supports_p (src_type)) > return false; > > range_op_handler handler (operation); > @@ -1720,7 +1720,7 @@ ipa_value_range_from_jfunc (vrange &vr, > > if (TREE_CODE_CLASS (operation) == tcc_unary) > { > - Value_Range res (vr_type); > + Value_Range res (parm_type); > > if (ipa_vr_operation_and_type_effects (res, > srcvr, > @@ -1733,7 +1733,7 @@ ipa_value_range_from_jfunc (vrange &vr, > Value_Range op_res (vr_type); > Value_Range res (vr_type); > tree op = ipa_get_jf_pass_through_operand (jfunc); > - Value_Range op_vr (vr_type); > + Value_Range op_vr (TREE_TYPE (op)); > range_op_handler handler (operation); > > ipa_range_set_and_normalize (op_vr, op); > @@ -2527,7 +2527,7 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, > if (src_lats->m_value_range.bottom_p ()) > return dest_lat->set_to_bottom (); > > - Value_Range vr (operand_type); > + Value_Range vr (param_type); > if (TREE_CODE_CLASS (operation) == tcc_unary) > ipa_vr_operation_and_type_effects (vr, > src_lats->m_value_range.m_vr, > @@ -2540,16 +2540,16 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, > { > tree op = ipa_get_jf_pass_through_operand (jfunc); > Value_Range op_vr (TREE_TYPE (op)); > - Value_Range op_res (operand_type); > + Value_Range op_res (param_type); > range_op_handler handler (operation); > > ipa_range_set_and_normalize (op_vr, op); > > if (!handler > - || !op_res.supports_type_p (operand_type) > + || !ipa_supports_p (operand_type) > || !handler.fold_range (op_res, operand_type, > src_lats->m_value_range.m_vr, op_vr)) > - op_res.set_varying (operand_type); > + op_res.set_varying (param_type); > > ipa_vr_operation_and_type_effects (vr, > op_res, > diff --git a/gcc/ipa-cp.h b/gcc/ipa-cp.h > index 7ff74fb5c98..abeaaa4053e 100644 > --- a/gcc/ipa-cp.h > +++ b/gcc/ipa-cp.h > @@ -291,4 +291,12 @@ public: > > bool values_equal_for_ipcp_p (tree x, tree y); > > +/* Return TRUE if IPA supports ranges of TYPE. */ > + > +static inline bool > +ipa_supports_p (tree type) > +{ > + return irange::supports_p (type); > +} > + > #endif /* IPA_CP_H */ > diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc > index dff40cd8aa5..1dbf5278149 100644 > --- a/gcc/ipa-fnsummary.cc > +++ b/gcc/ipa-fnsummary.cc > @@ -515,7 +515,7 @@ evaluate_conditions_for_known_args (struct cgraph_node *node, > } > else if (!op->val[1]) > { > - Value_Range op0 (op->type); > + Value_Range op0 (TREE_TYPE (op->val[0])); > range_op_handler handler (op->code); > > ipa_range_set_and_normalize (op0, op->val[0]); > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index b57f9750431..2d5c51298f2 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -2392,10 +2392,8 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, > else > { > if (param_type > - && Value_Range::supports_type_p (TREE_TYPE (arg)) > - && Value_Range::supports_type_p (param_type) > - && irange::supports_p (TREE_TYPE (arg)) > - && irange::supports_p (param_type) > + && ipa_supports_p (TREE_TYPE (arg)) > + && ipa_supports_p (param_type) > && get_range_query (cfun)->range_of_expr (vr, arg, cs->call_stmt) > && !vr.undefined_p ()) > { > @@ -5763,7 +5761,7 @@ ipcp_get_parm_bits (tree parm, tree *value, widest_int *mask) > ipcp_transformation *ts = ipcp_get_transformation_summary (cnode); > if (!ts > || vec_safe_length (ts->m_vr) == 0 > - || !irange::supports_p (TREE_TYPE (parm))) > + || !ipa_supports_p (TREE_TYPE (parm))) > return false; > > int i = ts->get_param_index (current_function_decl, parm); > -- > 2.44.0 >
Pushed to trunk. On Sun, Apr 28, 2024 at 10:10 PM Aldy Hernandez <aldyh@redhat.com> wrote: > > The polymorphic Value_Range object takes a tree type at construction > so it can determine what type of range to use (currently irange or > frange). It seems a few of the types are slightly off. This isn't a > problem now, because IPA only cares about integers and pointers, which > can both live in an irange. However, with prange coming about, we > need to get the type right, because you can't store an integer in a > pointer range or vice versa. > > Also, in preparation for prange, the irange::supports_p() idiom will become: > > irange::supports_p () || prange::supports_p() > > To avoid changing all these palces, I've added an inline function we > can later change and change everything at once. > > Finally, there's a Value_Range::supports_type_p() && > irange::supports_p() in the code. The latter is a subset of the > former, so there's no need to check both. > > OK for trunk? > > gcc/ChangeLog: > > * ipa-cp.cc (ipa_vr_operation_and_type_effects): Use ipa_supports_p. > (ipa_value_range_from_jfunc): Change Value_Range type. > (propagate_vr_across_jump_function): Same. > * ipa-cp.h (ipa_supports_p): New. > * ipa-fnsummary.cc (evaluate_conditions_for_known_args): Change Value_Range type. > * ipa-prop.cc (ipa_compute_jump_functions_for_edge): Use ipa_supports_p. > (ipcp_get_parm_bits): Same. > --- > gcc/ipa-cp.cc | 14 +++++++------- > gcc/ipa-cp.h | 8 ++++++++ > gcc/ipa-fnsummary.cc | 2 +- > gcc/ipa-prop.cc | 8 +++----- > 4 files changed, 19 insertions(+), 13 deletions(-) > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index a688dced5c9..5781f50c854 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1649,7 +1649,7 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, > enum tree_code operation, > tree dst_type, tree src_type) > { > - if (!irange::supports_p (dst_type) || !irange::supports_p (src_type)) > + if (!ipa_supports_p (dst_type) || !ipa_supports_p (src_type)) > return false; > > range_op_handler handler (operation); > @@ -1720,7 +1720,7 @@ ipa_value_range_from_jfunc (vrange &vr, > > if (TREE_CODE_CLASS (operation) == tcc_unary) > { > - Value_Range res (vr_type); > + Value_Range res (parm_type); > > if (ipa_vr_operation_and_type_effects (res, > srcvr, > @@ -1733,7 +1733,7 @@ ipa_value_range_from_jfunc (vrange &vr, > Value_Range op_res (vr_type); > Value_Range res (vr_type); > tree op = ipa_get_jf_pass_through_operand (jfunc); > - Value_Range op_vr (vr_type); > + Value_Range op_vr (TREE_TYPE (op)); > range_op_handler handler (operation); > > ipa_range_set_and_normalize (op_vr, op); > @@ -2527,7 +2527,7 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, > if (src_lats->m_value_range.bottom_p ()) > return dest_lat->set_to_bottom (); > > - Value_Range vr (operand_type); > + Value_Range vr (param_type); > if (TREE_CODE_CLASS (operation) == tcc_unary) > ipa_vr_operation_and_type_effects (vr, > src_lats->m_value_range.m_vr, > @@ -2540,16 +2540,16 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, > { > tree op = ipa_get_jf_pass_through_operand (jfunc); > Value_Range op_vr (TREE_TYPE (op)); > - Value_Range op_res (operand_type); > + Value_Range op_res (param_type); > range_op_handler handler (operation); > > ipa_range_set_and_normalize (op_vr, op); > > if (!handler > - || !op_res.supports_type_p (operand_type) > + || !ipa_supports_p (operand_type) > || !handler.fold_range (op_res, operand_type, > src_lats->m_value_range.m_vr, op_vr)) > - op_res.set_varying (operand_type); > + op_res.set_varying (param_type); > > ipa_vr_operation_and_type_effects (vr, > op_res, > diff --git a/gcc/ipa-cp.h b/gcc/ipa-cp.h > index 7ff74fb5c98..abeaaa4053e 100644 > --- a/gcc/ipa-cp.h > +++ b/gcc/ipa-cp.h > @@ -291,4 +291,12 @@ public: > > bool values_equal_for_ipcp_p (tree x, tree y); > > +/* Return TRUE if IPA supports ranges of TYPE. */ > + > +static inline bool > +ipa_supports_p (tree type) > +{ > + return irange::supports_p (type); > +} > + > #endif /* IPA_CP_H */ > diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc > index dff40cd8aa5..1dbf5278149 100644 > --- a/gcc/ipa-fnsummary.cc > +++ b/gcc/ipa-fnsummary.cc > @@ -515,7 +515,7 @@ evaluate_conditions_for_known_args (struct cgraph_node *node, > } > else if (!op->val[1]) > { > - Value_Range op0 (op->type); > + Value_Range op0 (TREE_TYPE (op->val[0])); > range_op_handler handler (op->code); > > ipa_range_set_and_normalize (op0, op->val[0]); > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index b57f9750431..2d5c51298f2 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -2392,10 +2392,8 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, > else > { > if (param_type > - && Value_Range::supports_type_p (TREE_TYPE (arg)) > - && Value_Range::supports_type_p (param_type) > - && irange::supports_p (TREE_TYPE (arg)) > - && irange::supports_p (param_type) > + && ipa_supports_p (TREE_TYPE (arg)) > + && ipa_supports_p (param_type) > && get_range_query (cfun)->range_of_expr (vr, arg, cs->call_stmt) > && !vr.undefined_p ()) > { > @@ -5763,7 +5761,7 @@ ipcp_get_parm_bits (tree parm, tree *value, widest_int *mask) > ipcp_transformation *ts = ipcp_get_transformation_summary (cnode); > if (!ts > || vec_safe_length (ts->m_vr) == 0 > - || !irange::supports_p (TREE_TYPE (parm))) > + || !ipa_supports_p (TREE_TYPE (parm))) > return false; > > int i = ts->get_param_index (current_function_decl, parm); > -- > 2.44.0 >
diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc index a688dced5c9..5781f50c854 100644 --- a/gcc/ipa-cp.cc +++ b/gcc/ipa-cp.cc @@ -1649,7 +1649,7 @@ ipa_vr_operation_and_type_effects (vrange &dst_vr, enum tree_code operation, tree dst_type, tree src_type) { - if (!irange::supports_p (dst_type) || !irange::supports_p (src_type)) + if (!ipa_supports_p (dst_type) || !ipa_supports_p (src_type)) return false; range_op_handler handler (operation); @@ -1720,7 +1720,7 @@ ipa_value_range_from_jfunc (vrange &vr, if (TREE_CODE_CLASS (operation) == tcc_unary) { - Value_Range res (vr_type); + Value_Range res (parm_type); if (ipa_vr_operation_and_type_effects (res, srcvr, @@ -1733,7 +1733,7 @@ ipa_value_range_from_jfunc (vrange &vr, Value_Range op_res (vr_type); Value_Range res (vr_type); tree op = ipa_get_jf_pass_through_operand (jfunc); - Value_Range op_vr (vr_type); + Value_Range op_vr (TREE_TYPE (op)); range_op_handler handler (operation); ipa_range_set_and_normalize (op_vr, op); @@ -2527,7 +2527,7 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, if (src_lats->m_value_range.bottom_p ()) return dest_lat->set_to_bottom (); - Value_Range vr (operand_type); + Value_Range vr (param_type); if (TREE_CODE_CLASS (operation) == tcc_unary) ipa_vr_operation_and_type_effects (vr, src_lats->m_value_range.m_vr, @@ -2540,16 +2540,16 @@ propagate_vr_across_jump_function (cgraph_edge *cs, ipa_jump_func *jfunc, { tree op = ipa_get_jf_pass_through_operand (jfunc); Value_Range op_vr (TREE_TYPE (op)); - Value_Range op_res (operand_type); + Value_Range op_res (param_type); range_op_handler handler (operation); ipa_range_set_and_normalize (op_vr, op); if (!handler - || !op_res.supports_type_p (operand_type) + || !ipa_supports_p (operand_type) || !handler.fold_range (op_res, operand_type, src_lats->m_value_range.m_vr, op_vr)) - op_res.set_varying (operand_type); + op_res.set_varying (param_type); ipa_vr_operation_and_type_effects (vr, op_res, diff --git a/gcc/ipa-cp.h b/gcc/ipa-cp.h index 7ff74fb5c98..abeaaa4053e 100644 --- a/gcc/ipa-cp.h +++ b/gcc/ipa-cp.h @@ -291,4 +291,12 @@ public: bool values_equal_for_ipcp_p (tree x, tree y); +/* Return TRUE if IPA supports ranges of TYPE. */ + +static inline bool +ipa_supports_p (tree type) +{ + return irange::supports_p (type); +} + #endif /* IPA_CP_H */ diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc index dff40cd8aa5..1dbf5278149 100644 --- a/gcc/ipa-fnsummary.cc +++ b/gcc/ipa-fnsummary.cc @@ -515,7 +515,7 @@ evaluate_conditions_for_known_args (struct cgraph_node *node, } else if (!op->val[1]) { - Value_Range op0 (op->type); + Value_Range op0 (TREE_TYPE (op->val[0])); range_op_handler handler (op->code); ipa_range_set_and_normalize (op0, op->val[0]); diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index b57f9750431..2d5c51298f2 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -2392,10 +2392,8 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, else { if (param_type - && Value_Range::supports_type_p (TREE_TYPE (arg)) - && Value_Range::supports_type_p (param_type) - && irange::supports_p (TREE_TYPE (arg)) - && irange::supports_p (param_type) + && ipa_supports_p (TREE_TYPE (arg)) + && ipa_supports_p (param_type) && get_range_query (cfun)->range_of_expr (vr, arg, cs->call_stmt) && !vr.undefined_p ()) { @@ -5763,7 +5761,7 @@ ipcp_get_parm_bits (tree parm, tree *value, widest_int *mask) ipcp_transformation *ts = ipcp_get_transformation_summary (cnode); if (!ts || vec_safe_length (ts->m_vr) == 0 - || !irange::supports_p (TREE_TYPE (parm))) + || !ipa_supports_p (TREE_TYPE (parm))) return false; int i = ts->get_param_index (current_function_decl, parm);