diff mbox

Fix PRs 50644,50741, segfaults in set_is_used

Message ID Pine.LNX.4.64.1111161749310.24833@wotan.suse.de
State New
Headers show

Commit Message

Michael Matz Nov. 16, 2011, 5:02 p.m. UTC
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?


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.

Comments

Richard Biener Nov. 16, 2011, 10:28 p.m. UTC | #1
On Wed, Nov 16, 2011 at 6:02 PM, Michael Matz <matz@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__};
> +}
>
diff mbox

Patch

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__};
+}