On Wed, Nov 16, 2011 at 6:02 PM, Michael Matz <m...@suse.de> wrote:
> Hi,
>
> this patch fixes both problems by using the same condition as
> add_referenced_var uses to guard walking into initializers.  I've
> considered some other solutions but the real nice one (merging local_decls
> and referenced_vars, and not using annotations for the used flag) doesn't
> seem appropriate for stage 3, and all the other ones would just look
> similar.
>
> I've deviated from richis proposed patch in 50741 in that I guard only
> walking into initializers of non-local vars, but still add those vars
> itself (so the invariant that all variables that are somehow mentioned in
> any instruction are in referenced_vars still holds).
>
> This doesn't fix the fortran PR50640 (select_type_12 segfault).  This
> testcase shows two problems, one is fixed by this patch, the other
> remains.  As the audit trail explains the fortran frontend really
> should present different code.
>
> Regstrapping for x86_64-linux in progress (all languages+Ada).  Okay if
> that passes?

Ok.

Thanks,
Richard.

>
> Ciao,
> Michael.
> ----------------
>        PR middle-end/50644
>        PR middle-end/50741
>
>        * tree-ssa-live.c (mark_all_vars_used_1): Recurse only for decls of
>        current function.
>        (remove_unused_locals): Ditto.
>
> testsuite/
>        PR middle-end/50644
>        PR middle-end/50741
>
>        * g++.dg/tree-ssa/pr50741.C: New.
>
> Index: tree-ssa-live.c
> ===================================================================
> --- tree-ssa-live.c     (revision 181172)
> +++ tree-ssa-live.c     (working copy)
> @@ -374,7 +374,8 @@ mark_all_vars_used_1 (tree *tp, int *wal
>      eliminated as unused.  */
>   if (TREE_CODE (t) == VAR_DECL)
>     {
> -      if (data != NULL && bitmap_clear_bit ((bitmap) data, DECL_UID (t)))
> +      if (data != NULL && bitmap_clear_bit ((bitmap) data, DECL_UID (t))
> +         && DECL_CONTEXT (t) == current_function_decl)
>        mark_all_vars_used (&DECL_INITIAL (t), data);
>       set_is_used (t);
>     }
> @@ -836,7 +837,8 @@ remove_unused_locals (void)
>        if (TREE_CODE (var) == VAR_DECL
>            && is_global_var (var)
>            && var_ann (var) != NULL
> -           && is_used_p (var))
> +           && is_used_p (var)
> +           && DECL_CONTEXT (var) == current_function_decl)
>          mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
>
>       num = VEC_length (tree, cfun->local_decls);
> Index: testsuite/g++.dg/tree-ssa/pr50741.C
> ===================================================================
> --- testsuite/g++.dg/tree-ssa/pr50741.C (revision 0)
> +++ testsuite/g++.dg/tree-ssa/pr50741.C (revision 0)
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +/* PR middle-end/50741 */
> +
> +struct PublishLo
> +{
> +  const char *functionName;
> +  ~PublishLo();
> +};
> +struct A { A(); };
> +A::A()
> +{
> +  static PublishLo _rL_53 = {__FUNCTION__};
> +}
>

Reply via email to