tree.c (free_node): New function.
authorJan Hubicka <hubicka@ucw.cz>
Tue, 24 Nov 2015 19:04:04 +0000 (20:04 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 24 Nov 2015 19:04:04 +0000 (19:04 +0000)
* tree.c (free_node): New function.
(type_hash_canon): Use it.
* tree.h (free_node): Declare.
* lto.c (unify_scc): Use free_node.

From-SVN: r230833

gcc/ChangeLog
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/tree.c
gcc/tree.h

index 56e5e6d226a52221dfb93726a112496ae39e3ba5..d4db20a700e2041ceb9dead7bf6740bac13a2683 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-24  Jan Hubicka  <hubicka@ucw.cz>
+
+       * tree.c (free_node): New function.
+       (type_hash_canon): Use it.
+       * tree.h (free_node): Declare.
+
 2015-11-24  David Edelsohn  <dje.gcc@gmail.com>
            Michael Meissner  <meissner@linux.vnet.ibm.com>
 
index 410533710ae8c124b355c2bbcbac11da6ddd67b1..9d6b12640c6e4c899e3ae2c2ed39af902083cfff 100644 (file)
@@ -1,3 +1,7 @@
+2015-11-24  Jan Hubicka  <hubicka@ucw.cz>
+
+       * lto.c (unify_scc): Use free_node.
+
 2015-11-21  Jan Hubicka  <hubicka@ucw.cz>
 
        * lto.c (iterative_hash_canonical_type): Always recurse for pointers.
index 26614912e3b9bf84bb3d23dc36acb45a7d9d109f..c4c51588adcb6ea86737c5f051a7b8066b4482d1 100644 (file)
@@ -1623,13 +1623,9 @@ unify_scc (struct data_in *data_in, unsigned from,
          data_in->location_cache.revert_location_cache ();
          for (unsigned i = 0; i < len; ++i)
            {
-             enum tree_code code;
              if (TYPE_P (scc->entries[i]))
                num_merged_types++;
-             code = TREE_CODE (scc->entries[i]);
-             if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
-               vec_free (CONSTRUCTOR_ELTS (scc->entries[i]));
-             ggc_free (scc->entries[i]);
+             free_node (scc->entries[i]);
            }
 
          break;
index 779fe9386a27b2b09b66c06e52eddc30b072b8a8..2888657fe044d6f6554363e6db06c2a3d703053d 100644 (file)
@@ -1103,6 +1103,27 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
 
   return t;
 }
+
+/* Free tree node.  */
+
+void
+free_node (tree node)
+{
+  enum tree_code code = TREE_CODE (node);
+  if (GATHER_STATISTICS)
+    {
+      tree_code_counts[(int) TREE_CODE (node)]--;
+      tree_node_counts[(int) t_kind]--;
+      tree_node_sizes[(int) t_kind] -= tree_code_size (TREE_CODE (node));
+    }
+  if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
+    vec_free (CONSTRUCTOR_ELTS (node));
+  else if (code == BLOCK)
+    vec_free (BLOCK_NONLOCALIZED_VARS (node));
+  else if (code == TREE_BINFO)
+    vec_free (BINFO_BASE_ACCESSES (node));
+  ggc_free (node);
+}
 \f
 /* Return a new node with the same contents as NODE except that its
    TREE_CHAIN, if it has one, is zero and it has a fresh uid.  */
@@ -7100,12 +7121,7 @@ type_hash_canon (unsigned int hashcode, tree type)
     {
       tree t1 = ((type_hash *) *loc)->type;
       gcc_assert (TYPE_MAIN_VARIANT (t1) == t1);
-      if (GATHER_STATISTICS)
-       {
-         tree_code_counts[(int) TREE_CODE (type)]--;
-         tree_node_counts[(int) t_kind]--;
-         tree_node_sizes[(int) t_kind] -= sizeof (struct tree_type_non_common);
-       }
+      free_node (type);
       return t1;
     }
   else
index cb52debc3d17490e989f26906de7b5f380b46d88..6c733aa5e4c952d670053cc967e54ebaf70c6e72 100644 (file)
@@ -3763,6 +3763,10 @@ extern int allocate_decl_uid (void);
 extern tree make_node_stat (enum tree_code MEM_STAT_DECL);
 #define make_node(t) make_node_stat (t MEM_STAT_INFO)
 
+/* Free tree node.  */
+
+extern void free_node (tree);
+
 /* Make a copy of a node, with all the same contents.  */
 
 extern tree copy_node_stat (tree MEM_STAT_DECL);