diff mbox series

[1/3] ipa-cp: Templatize filtering of m_agg_values

Message ID f78f2739548afede5888c2b9f91b82eb2f151e93.1696508299.git.mjambor@suse.cz
State New
Headers show
Series [1/3] ipa-cp: Templatize filtering of m_agg_values | expand

Commit Message

Martin Jambor Oct. 5, 2023, 12:06 p.m. UTC
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

Jan Hubicka Oct. 5, 2023, 1:08 p.m. UTC | #1
> 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
diff mbox series

Patch

diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h
index 7e033d2a7b8..815855006e8 100644
--- a/gcc/ipa-prop.h
+++ b/gcc/ipa-prop.h
@@ -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.  */
diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc
index edba364f56e..1551b694679 100644
--- a/gcc/ipa-sra.cc
+++ b/gcc/ipa-sra.cc
@@ -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);