[patch] Call free_after_parsing earlier

Steven Bosscher stevenb.gcc@gmail.com
Wed Jul 11 19:40:00 GMT 2012


Hello,

GCC calls free_after_parsing in rest_of_clean_state.
That's way too late, it can be done in free_lang_data_in_cgraph instead.

While there, I noticed a silly loop in final.c, and cleaned that up too.

Bootstrapped&tested on x86_64-unknown-linux-gnu. OK for trunk?

Ciao!
Steven

        * final.c (final): Don't loop to find max_uid.
        (rest_of_clean_state): Don't call free_after_parsing here.
        * tree.c (free_lang_data_in_cgraph): Call free_after_parsing here.

Index: final.c
===================================================================
--- final.c     (revision 189423)
+++ final.c     (working copy)
@@ -1826,7 +1826,6 @@ void
 final (rtx first, FILE *file, int optimize_p)
 {
   rtx insn, next;
-  int max_uid = 0;
   int seen = 0;

   /* Used for -dA dump.  */
@@ -1837,11 +1836,9 @@ final (rtx first, FILE *file, int optimi

   last_ignored_compare = 0;

+#ifdef HAVE_cc0
   for (insn = first; insn; insn = NEXT_INSN (insn))
     {
-      if (INSN_UID (insn) > max_uid)       /* Find largest UID.  */
-       max_uid = INSN_UID (insn);
-#ifdef HAVE_cc0
       /* If CC tracking across branches is enabled, record the insn which
         jumps to each branch only reached from one place.  */
       if (optimize_p && JUMP_P (insn))
@@ -1852,8 +1849,8 @@ final (rtx first, FILE *file, int optimi
              LABEL_REFS (lab) = insn;
            }
        }
-#endif
     }
+#endif

   init_recog ();

@@ -4500,7 +4497,6 @@ rest_of_clean_state (void)
   init_recog_no_volatile ();

   /* We're done with this function.  Free up memory if we can.  */
-  free_after_parsing (cfun);
   free_after_compilation (cfun);
   return 0;
 }
Index: tree.c
===================================================================
--- tree.c      (revision 189423)
+++ tree.c      (working copy)
@@ -5167,16 +5167,19 @@ assign_assembler_name_if_neeeded (tree t


 /* Free language specific information for every operand and expression
-   in every node of the call graph.  This process operates in three stages:
+   in every node of the call graph.  This process operates in four stages:

-   1- Every callgraph node and varpool node is traversed looking for
+   1- Every function is traversed to free any front-end specific
+      data hung from the function's struct function->language.
+
+   2- Every callgraph node and varpool node is traversed looking for
       decls and types embedded in them.  This is a more exhaustive
       search than that done by find_referenced_vars, because it will
       also collect individual fields, decls embedded in types, etc.

-   2- All the decls found are sent to free_lang_data_in_decl.
+   3- All the decls found are sent to free_lang_data_in_decl.

-   3- All the types found are sent to free_lang_data_in_type.
+   4- All the types found are sent to free_lang_data_in_type.

    The ordering between decls and types is important because
    free_lang_data_in_decl sets assembler names, which includes
@@ -5193,6 +5196,10 @@ free_lang_data_in_cgraph (void)
   unsigned i;
   alias_pair *p;

+  /* Clear out function->language.  */
+  FOR_EACH_FUNCTION (n)
+    free_after_parsing (DECL_STRUCT_FUNCTION (n->symbol.decl));
+
   /* Initialize sets and arrays to store referenced decls and types.  */
   fld.pset = pointer_set_create ();
   fld.worklist = NULL;



More information about the Gcc-patches mailing list