]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa-cp: Templatize filtering of m_agg_values
authorMartin Jambor <mjambor@suse.cz>
Mon, 30 Oct 2023 17:34:59 +0000 (18:34 +0100)
committerMartin Jambor <mjambor@suse.cz>
Mon, 30 Oct 2023 17:36:40 +0000 (18:36 +0100)
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
gcc/ipa-sra.cc

index a7f34a8393b13705a552a3109605e69ceec01550..34b0d77b34bb76345d8ed17fda5db4e540007aea 100644 (file)
@@ -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.  */
index 495d7e67d6e26d6f3ab77669fda97aba97bc2045..6ffad335db442c3ae8e70626456025c62e120a51 100644 (file)
@@ -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);