aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2023-10-30 18:34:59 +0100
committerMartin Jambor <mjambor@suse.cz>2023-10-30 18:36:40 +0100
commit1437df40f12ade35fd1f1a3e4cbba4b4656cab0b (patch)
tree2c60a58e1b4ed95b4e8fcda3583c82dfde6cd7b0
parent68880e40533c41c89eb72247c3080703ad09270c (diff)
downloadgcc-1437df40f12ade35fd1f1a3e4cbba4b4656cab0b.zip
gcc-1437df40f12ade35fd1f1a3e4cbba4b4656cab0b.tar.gz
gcc-1437df40f12ade35fd1f1a3e4cbba4b4656cab0b.tar.bz2
ipa-cp: Templatize filtering of m_agg_values
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.
-rw-r--r--gcc/ipa-prop.h33
-rw-r--r--gcc/ipa-sra.cc33
2 files changed, 37 insertions, 29 deletions
diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index a7f34a8..34b0d77 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -947,6 +947,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;
/* Value range information. */
diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
index 495d7e6..6ffad33 100644
--- a/gcc/ipa-sra.cc
+++ b/gcc/ipa-sra.cc
@@ -4104,35 +4104,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_vr = false;
unsigned count = vec_safe_length (ts->m_vr);