diff mbox

Fix bootstrap with go (uninit warning with ab edges)

Message ID 20130425220258.GL28963@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek April 25, 2013, 10:02 p.m. UTC
Hi!

Bootstrap currently fails in libgo, there are false positive warnings
that ({anonymous}) is uninitialized in multiple places.

The testcase below reproduces this issue too.  The problem is
that the ab edges to setjmp call are added conservatively, thus they can be
added even from calls before the setjmp call, that are never executed after
the setjmp, and in their bb's some variables might not be initialized yet,
even if their initialization dominates the setjmp call.

As discussed on IRC, the following patch let us ignore the SSA_NAMEs on such
abnormal edges.  Perhaps later on we could try to do something for the
common case where there is exactly one setjmp call or exactly one nonlocal
goto label in a function, we could then avoid creating abnormal edges that
aren't needed (calls that don't appear on any path from the single setjmp
call to exit don't need to have ab edge to it).  Bootstrapped/regtested on
x86_64-linux and i686-linux (including go), ok for trunk?

2013-04-25  Jakub Jelinek  <jakub@redhat.com>

	* tree-ssa-uninit.c (compute_uninit_opnds_pos): In functions
	with nonlocal goto receivers or returns twice calls, ignore
	unininitialized values from abnormal edges to nl goto receiver
	or returns twice call.

	* gcc.dg/setjmp-5.c: New test.


	Jakub

Comments

Ian Lance Taylor April 26, 2013, 5:20 a.m. UTC | #1
On Thu, Apr 25, 2013 at 3:02 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>
> 2013-04-25  Jakub Jelinek  <jakub@redhat.com>
>
>         * tree-ssa-uninit.c (compute_uninit_opnds_pos): In functions
>         with nonlocal goto receivers or returns twice calls, ignore
>         unininitialized values from abnormal edges to nl goto receiver
>         or returns twice call.
>
>         * gcc.dg/setjmp-5.c: New test.

Thanks for looking into this.  This is PR 57045.

Ian
Richard Biener April 26, 2013, 7:40 a.m. UTC | #2
On Fri, 26 Apr 2013, Jakub Jelinek wrote:

> Hi!
> 
> Bootstrap currently fails in libgo, there are false positive warnings
> that ({anonymous}) is uninitialized in multiple places.
> 
> The testcase below reproduces this issue too.  The problem is
> that the ab edges to setjmp call are added conservatively, thus they can be
> added even from calls before the setjmp call, that are never executed after
> the setjmp, and in their bb's some variables might not be initialized yet,
> even if their initialization dominates the setjmp call.
> 
> As discussed on IRC, the following patch let us ignore the SSA_NAMEs on such
> abnormal edges.  Perhaps later on we could try to do something for the
> common case where there is exactly one setjmp call or exactly one nonlocal
> goto label in a function, we could then avoid creating abnormal edges that
> aren't needed (calls that don't appear on any path from the single setjmp
> call to exit don't need to have ab edge to it).  Bootstrapped/regtested on
> x86_64-linux and i686-linux (including go), ok for trunk?

Ok.

Thanks,
Richard.

> 2013-04-25  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* tree-ssa-uninit.c (compute_uninit_opnds_pos): In functions
> 	with nonlocal goto receivers or returns twice calls, ignore
> 	unininitialized values from abnormal edges to nl goto receiver
> 	or returns twice call.
> 
> 	* gcc.dg/setjmp-5.c: New test.
> 
> --- gcc/tree-ssa-uninit.c.jj	2013-03-04 10:37:48.000000000 +0100
> +++ gcc/tree-ssa-uninit.c	2013-04-25 17:52:55.215166853 +0200
> @@ -151,7 +151,21 @@ compute_uninit_opnds_pos (gimple phi)
>        if (TREE_CODE (op) == SSA_NAME
>            && ssa_undefined_value_p (op)
>            && !can_skip_redundant_opnd (op, phi))
> -        MASK_SET_BIT (uninit_opnds, i);
> +	{
> +	  /* Ignore SSA_NAMEs on abnormal edges to setjmp
> +	     or nonlocal goto receiver.  */
> +          if (cfun->has_nonlocal_label || cfun->calls_setjmp)
> +	    {
> +	      edge e = gimple_phi_arg_edge (phi, i);
> +	      if (e->flags & EDGE_ABNORMAL)
> +		{
> +		  gimple last = last_stmt (e->src);
> +		  if (last && stmt_can_make_abnormal_goto (last))
> +		    continue;
> +		}
> +	    }
> +	  MASK_SET_BIT (uninit_opnds, i);
> +	}
>      }
>    return uninit_opnds;
>  }
> --- gcc/testsuite/gcc.dg/setjmp-5.c.jj	2013-04-25 17:54:49.679559650 +0200
> +++ gcc/testsuite/gcc.dg/setjmp-5.c	2013-04-25 17:55:08.084460447 +0200
> @@ -0,0 +1,22 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -Wall" } */
> +
> +#include <setjmp.h>
> +
> +void bar (int);
> +
> +jmp_buf buf;
> +int v;
> +
> +void
> +foo (void)
> +{
> +  int i;
> +  bar (0);
> +  bar (1);
> +  i = 5;
> +  int j = setjmp (buf);
> +  if (j == 0)
> +    bar (2);
> +  v = i;	/* { dg-bogus "may be used uninitialized in this function" } */
> +}
> 
> 	Jakub
> 
>
diff mbox

Patch

--- gcc/tree-ssa-uninit.c.jj	2013-03-04 10:37:48.000000000 +0100
+++ gcc/tree-ssa-uninit.c	2013-04-25 17:52:55.215166853 +0200
@@ -151,7 +151,21 @@  compute_uninit_opnds_pos (gimple phi)
       if (TREE_CODE (op) == SSA_NAME
           && ssa_undefined_value_p (op)
           && !can_skip_redundant_opnd (op, phi))
-        MASK_SET_BIT (uninit_opnds, i);
+	{
+	  /* Ignore SSA_NAMEs on abnormal edges to setjmp
+	     or nonlocal goto receiver.  */
+          if (cfun->has_nonlocal_label || cfun->calls_setjmp)
+	    {
+	      edge e = gimple_phi_arg_edge (phi, i);
+	      if (e->flags & EDGE_ABNORMAL)
+		{
+		  gimple last = last_stmt (e->src);
+		  if (last && stmt_can_make_abnormal_goto (last))
+		    continue;
+		}
+	    }
+	  MASK_SET_BIT (uninit_opnds, i);
+	}
     }
   return uninit_opnds;
 }
--- gcc/testsuite/gcc.dg/setjmp-5.c.jj	2013-04-25 17:54:49.679559650 +0200
+++ gcc/testsuite/gcc.dg/setjmp-5.c	2013-04-25 17:55:08.084460447 +0200
@@ -0,0 +1,22 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+#include <setjmp.h>
+
+void bar (int);
+
+jmp_buf buf;
+int v;
+
+void
+foo (void)
+{
+  int i;
+  bar (0);
+  bar (1);
+  i = 5;
+  int j = setjmp (buf);
+  if (j == 0)
+    bar (2);
+  v = i;	/* { dg-bogus "may be used uninitialized in this function" } */
+}