On Wed, Jul 11, 2012 at 9:39 PM, Steven Bosscher <stevenb....@gmail.com> wrote:
> 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.

But that's only called with -flto ... I think it should be called in
cgraph_finalize_function instead (being optimistic here - heh).

Richard.

> 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;

Reply via email to