This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix bootstrap with go (uninit warning with ab edges)


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.

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]