[1/3] ipa-cp: Templatize filtering of m_agg_values
Checks
Commit Message
PR 111157 points to another place where IPA-CP collected aggregate
compile-time constants need to be filtered, in addition to the one
place that already does this in ipa-sra. In order to re-use code,
this patch turns the common bit into a template.
The functionality is still covered by testcase gcc.dg/ipa/pr108959.c.
gcc/ChangeLog:
2023-09-13 Martin Jambor <mjambor@suse.cz>
PR ipa/111157
* ipa-prop.h (ipcp_transformation): New member function template
remove_argaggs_if.
* ipa-sra.cc (zap_useless_ipcp_results): Use remove_argaggs_if to
filter aggreagate constants.
---
gcc/ipa-prop.h | 33 +++++++++++++++++++++++++++++++++
gcc/ipa-sra.cc | 33 ++++-----------------------------
2 files changed, 37 insertions(+), 29 deletions(-)
Comments
> PR 111157 points to another place where IPA-CP collected aggregate
> compile-time constants need to be filtered, in addition to the one
> place that already does this in ipa-sra. In order to re-use code,
> this patch turns the common bit into a template.
>
> The functionality is still covered by testcase gcc.dg/ipa/pr108959.c.
>
> gcc/ChangeLog:
>
> 2023-09-13 Martin Jambor <mjambor@suse.cz>
>
> PR ipa/111157
> * ipa-prop.h (ipcp_transformation): New member function template
> remove_argaggs_if.
> * ipa-sra.cc (zap_useless_ipcp_results): Use remove_argaggs_if to
> filter aggreagate constants.
OK,
Honza
@@ -966,6 +966,39 @@ struct GTY(()) ipcp_transformation
void maybe_create_parm_idx_map (tree fndecl);
+ /* Remove all elements in m_agg_values on which PREDICATE returns true. */
+
+ template<typename pred_function>
+ void remove_argaggs_if (pred_function &&predicate)
+ {
+ unsigned ts_len = vec_safe_length (m_agg_values);
+ if (ts_len == 0)
+ return;
+
+ bool removed_item = false;
+ unsigned dst_index = 0;
+
+ for (unsigned i = 0; i < ts_len; i++)
+ {
+ ipa_argagg_value *v = &(*m_agg_values)[i];
+ if (!predicate (*v))
+ {
+ if (removed_item)
+ (*m_agg_values)[dst_index] = *v;
+ dst_index++;
+ }
+ else
+ removed_item = true;
+ }
+ if (dst_index == 0)
+ {
+ ggc_free (m_agg_values);
+ m_agg_values = NULL;
+ }
+ else if (removed_item)
+ m_agg_values->truncate (dst_index);
+ }
+
/* Known aggregate values. */
vec<ipa_argagg_value, va_gc> *m_agg_values;
/* Known bits information. */
@@ -4047,35 +4047,10 @@ mark_callers_calls_comdat_local (struct cgraph_node *node, void *)
static void
zap_useless_ipcp_results (const isra_func_summary *ifs, ipcp_transformation *ts)
{
- unsigned ts_len = vec_safe_length (ts->m_agg_values);
-
- if (ts_len == 0)
- return;
-
- bool removed_item = false;
- unsigned dst_index = 0;
-
- for (unsigned i = 0; i < ts_len; i++)
- {
- ipa_argagg_value *v = &(*ts->m_agg_values)[i];
- const isra_param_desc *desc = &(*ifs->m_parameters)[v->index];
-
- if (!desc->locally_unused)
- {
- if (removed_item)
- (*ts->m_agg_values)[dst_index] = *v;
- dst_index++;
- }
- else
- removed_item = true;
- }
- if (dst_index == 0)
- {
- ggc_free (ts->m_agg_values);
- ts->m_agg_values = NULL;
- }
- else if (removed_item)
- ts->m_agg_values->truncate (dst_index);
+ ts->remove_argaggs_if ([ifs](const ipa_argagg_value &v)
+ {
+ return (*ifs->m_parameters)[v.index].locally_unused;
+ });
bool useful_bits = false;
unsigned count = vec_safe_length (ts->bits);