return auto_vec from cgraph_node::collect_callers
authorTrevor Saunders <tbsaunde@tbsaunde.org>
Sun, 6 Jun 2021 20:30:29 +0000 (16:30 -0400)
committerTrevor Saunders <tbsaunde@tbsaunde.org>
Thu, 17 Jun 2021 08:43:27 +0000 (04:43 -0400)
This ensures the callers of collect_callers () take ownership of the vector and
free it when appropriate.

Signed-off-by: Trevor Saunders <tbsaunde@tbsaunde.org>
gcc/ChangeLog:

* cgraph.c (cgraph_node::collect_callers): Return
auto_vec<cgraph_edge *>.
* cgraph.h (cgraph_node::collect_callers): Likewise.
* ipa-cp.c (create_specialized_node): Adjust.
(decide_about_value): Likewise.
(decide_whether_version_node): Likewise.
* ipa-sra.c (process_isra_node_results): Likewise.

gcc/cgraph.c
gcc/cgraph.h
gcc/ipa-cp.c
gcc/ipa-sra.c

index d7c78d518bc4955dde877f9b6eaab04bd66b9734..abe4e3ebfb3e5a70beaec40c1bf26d708318787a 100644 (file)
@@ -3074,10 +3074,10 @@ collect_callers_of_node_1 (cgraph_node *node, void *data)
 /* Collect all callers of cgraph_node and its aliases that are known to lead to
    cgraph_node (i.e. are not overwritable).  */
 
-vec<cgraph_edge *>
+auto_vec<cgraph_edge *>
 cgraph_node::collect_callers (void)
 {
-  vec<cgraph_edge *> redirect_callers = vNULL;
+  auto_vec<cgraph_edge *> redirect_callers;
   call_for_symbol_thunks_and_aliases (collect_callers_of_node_1,
                                    &redirect_callers, false);
   return redirect_callers;
index 4a1f89920f56b685c1f33843fb86848b5847cbeb..9f4338fdf875ea330988e20e4fa3a37621043afd 100644 (file)
@@ -1139,7 +1139,7 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node
 
   /* Collect all callers of cgraph_node and its aliases that are known to lead
      to NODE (i.e. are not overwritable) and that are not thunks.  */
-  vec<cgraph_edge *> collect_callers (void);
+  auto_vec<cgraph_edge *> collect_callers (void);
 
   /* Remove all callers from the node.  */
   void remove_callers (void);
index 2cae69e5a1b6216225c8b633da99e90151359e14..57c18af2baba4ef1f5eb418d64528377b1616baf 100644 (file)
@@ -4527,7 +4527,7 @@ create_specialized_node (struct cgraph_node *node,
                         vec<tree> known_csts,
                         vec<ipa_polymorphic_call_context> known_contexts,
                         struct ipa_agg_replacement_value *aggvals,
-                        vec<cgraph_edge *> callers)
+                        vec<cgraph_edge *> &callers)
 {
   ipa_node_params *new_info, *info = ipa_node_params_sum->get (node);
   vec<ipa_replace_map *, va_gc> *replace_trees = NULL;
@@ -4672,7 +4672,6 @@ create_specialized_node (struct cgraph_node *node,
 
   ipcp_discover_new_direct_edges (new_node, known_csts, known_contexts, aggvals);
 
-  callers.release ();
   return new_node;
 }
 
@@ -5562,6 +5561,7 @@ decide_about_value (struct cgraph_node *node, int index, HOST_WIDE_INT offset,
                                                      offset, val->value));
   val->spec_node = create_specialized_node (node, known_csts, known_contexts,
                                            aggvals, callers);
+  callers.release ();
   overall_size += val->local_size_cost;
   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file, "     overall size reached %li\n",
@@ -5638,7 +5638,7 @@ decide_whether_version_node (struct cgraph_node *node)
        }
 
       struct cgraph_node *clone;
-      vec<cgraph_edge *> callers = node->collect_callers ();
+      auto_vec<cgraph_edge *> callers = node->collect_callers ();
 
       for (int i = callers.length () - 1; i >= 0; i--)
        {
@@ -5654,7 +5654,6 @@ decide_whether_version_node (struct cgraph_node *node)
          /* If node is not called by anyone, or all its caller edges are
             self-recursive, the node is not really in use, no need to do
             cloning.  */
-         callers.release ();
          info->do_clone_for_all_contexts = false;
          return ret;
        }
index 3f90d4d81b681534c88ff34763eaf8e9a9b077b0..3272daf56e4626f639b4a9beb484f754a38d2c2c 100644 (file)
@@ -3755,7 +3755,7 @@ process_isra_node_results (cgraph_node *node,
   unsigned &suffix_counter = clone_num_suffixes->get_or_insert (
                               IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (
                                 node->decl)));
-  vec<cgraph_edge *> callers = node->collect_callers ();
+  auto_vec<cgraph_edge *> callers = node->collect_callers ();
   cgraph_node *new_node
     = node->create_virtual_clone (callers, NULL, new_adjustments, "isra",
                                  suffix_counter);