Message ID | 20130425220258.GL28963@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
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
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 > >
--- 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" } */ +}