Commit ba7e83f8 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/57149 (wrong -Wmaybe-uninitialized warning with -Os)

	PR tree-optimization/57149
	* tree-ssa-uninit.c (uninit_undefined_value_p): New inline.
	(can_skip_redundant_opnd, compute_uninit_opnds_pos,
	collect_phi_def_edges, execute_late_warn_uninitialized): Use
	uninit_undefined_value_p instead of ssa_undefined_value_p.

	* gcc.dg/pr57149.c: New test.

From-SVN: r198671
parent 43303d6f
2013-05-07 Jakub Jelinek <jakub@redhat.com> 2013-05-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/57149
* tree-ssa-uninit.c (uninit_undefined_value_p): New inline.
(can_skip_redundant_opnd, compute_uninit_opnds_pos,
collect_phi_def_edges, execute_late_warn_uninitialized): Use
uninit_undefined_value_p instead of ssa_undefined_value_p.
PR debug/57184 PR debug/57184
* expr.c (expand_expr_addr_expr_1): Handle COMPOUND_LITERAL_EXPR * expr.c (expand_expr_addr_expr_1): Handle COMPOUND_LITERAL_EXPR
for modifier == EXPAND_INITIALIZER. for modifier == EXPAND_INITIALIZER.
......
2013-05-07 Jakub Jelinek <jakub@redhat.com> 2013-05-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/57149
* gcc.dg/pr57149.c: New test.
PR debug/57184 PR debug/57184
* gcc.dg/pr57184.c: New test. * gcc.dg/pr57184.c: New test.
......
/* PR tree-optimization/57149 */
/* { dg-do compile } */
/* { dg-options "-Os -Wuninitialized" } */
struct A { struct A *a, *b; };
struct D { struct A e; };
struct E { unsigned char f; struct { struct A e; } g; };
struct F { struct E i[32]; };
extern int fn0 (void);
extern int fn1 (struct E *, struct D *);
static inline __attribute__ ((always_inline)) int
fn2 (const struct A *x)
{
return x->a == x;
}
static int
fn3 (struct E *x)
{
struct D *l, *m;
int retval = retval;
if (fn2 (&x->g.e))
return 0;
for (l = (struct D *) x->g.e.a, m = (struct D *) l->e.a;
&l->e != &x->g.e;
l = m, m = (struct D *) m->e.a)
retval = fn1 (x, l);
return retval;
}
void
fn4 (struct F *x, unsigned k)
{
unsigned i;
for (i = 0; i < k; i++)
{
struct E *y = &x->i[i];
int err = -22;
err = fn3 (y);
if (y->f == 0)
{
if (err > 0)
err = fn0 ();
if (err < 0) /* { dg-bogus "may be used uninitialized in this function" } */
fn0 ();
}
}
}
...@@ -101,6 +101,19 @@ ssa_undefined_value_p (tree t) ...@@ -101,6 +101,19 @@ ssa_undefined_value_p (tree t)
&& pointer_set_contains (possibly_undefined_names, t))); && pointer_set_contains (possibly_undefined_names, t)));
} }
/* Like ssa_undefined_value_p, but don't return true if TREE_NO_WARNING
is set on SSA_NAME_VAR. */
static inline bool
uninit_undefined_value_p (tree t)
{
if (!ssa_undefined_value_p (t))
return false;
if (SSA_NAME_VAR (t) && TREE_NO_WARNING (SSA_NAME_VAR (t)))
return false;
return true;
}
/* Checks if the operand OPND of PHI is defined by /* Checks if the operand OPND of PHI is defined by
another phi with one operand defined by this PHI, another phi with one operand defined by this PHI,
but the rest operands are all defined. If yes, but the rest operands are all defined. If yes,
...@@ -124,7 +137,7 @@ can_skip_redundant_opnd (tree opnd, gimple phi) ...@@ -124,7 +137,7 @@ can_skip_redundant_opnd (tree opnd, gimple phi)
tree op = gimple_phi_arg_def (op_def, i); tree op = gimple_phi_arg_def (op_def, i);
if (TREE_CODE (op) != SSA_NAME) if (TREE_CODE (op) != SSA_NAME)
continue; continue;
if (op != phi_def && ssa_undefined_value_p (op)) if (op != phi_def && uninit_undefined_value_p (op))
return false; return false;
} }
...@@ -149,7 +162,7 @@ compute_uninit_opnds_pos (gimple phi) ...@@ -149,7 +162,7 @@ compute_uninit_opnds_pos (gimple phi)
{ {
tree op = gimple_phi_arg_def (phi, i); tree op = gimple_phi_arg_def (phi, i);
if (TREE_CODE (op) == SSA_NAME if (TREE_CODE (op) == SSA_NAME
&& ssa_undefined_value_p (op) && uninit_undefined_value_p (op)
&& !can_skip_redundant_opnd (op, phi)) && !can_skip_redundant_opnd (op, phi))
{ {
/* Ignore SSA_NAMEs on abnormal edges to setjmp /* Ignore SSA_NAMEs on abnormal edges to setjmp
...@@ -518,7 +531,7 @@ collect_phi_def_edges (gimple phi, basic_block cd_root, ...@@ -518,7 +531,7 @@ collect_phi_def_edges (gimple phi, basic_block cd_root,
gimple_bb (def), cd_root)) gimple_bb (def), cd_root))
collect_phi_def_edges (def, cd_root, edges, collect_phi_def_edges (def, cd_root, edges,
visited_phis); visited_phis);
else if (!ssa_undefined_value_p (opnd)) else if (!uninit_undefined_value_p (opnd))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
...@@ -2002,7 +2015,7 @@ execute_late_warn_uninitialized (void) ...@@ -2002,7 +2015,7 @@ execute_late_warn_uninitialized (void)
{ {
tree op = gimple_phi_arg_def (phi, i); tree op = gimple_phi_arg_def (phi, i);
if (TREE_CODE (op) == SSA_NAME if (TREE_CODE (op) == SSA_NAME
&& ssa_undefined_value_p (op)) && uninit_undefined_value_p (op))
{ {
worklist.safe_push (phi); worklist.safe_push (phi);
pointer_set_insert (added_to_worklist, phi); pointer_set_insert (added_to_worklist, phi);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment