This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix bootstrap with go (uninit warning with ab edges)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Biener <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 26 Apr 2013 00:02:58 +0200
- Subject: [PATCH] Fix bootstrap with go (uninit warning with ab edges)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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