summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-03-19 10:44:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-03-19 10:44:52 +0000
commit8cb3ee3785019dc4b2566360816f0b83aeea4e2e (patch)
treec2091432f1378f837c2a13f54a2dd45d2c6b2193 /gcc/tree-ssa.c
parent21c2d075c06a1b858bd12831dff8ff2786d394fd (diff)
downloadgcc-8cb3ee3785019dc4b2566360816f0b83aeea4e2e.tar.gz
re PR tree-optimization/35609 ("is used uninitialized in this function" should be may warning)
2008-03-19 Richard Guenther <rguenther@suse.de> PR middle-end/35609 * tree-ssa.c (always_executed): New global flag. (warn_uninitialized_var): If !always_executed warn with "maybe" instead of "is". (execute_early_warn_uninitialized): Compute post-dominators. Initialize always_executed before processing each basic block. * gcc.dg/testsuite/uninit-15.c: New testcase. * gcc.dg/testsuite/uninit-16.c: Likewise. From-SVN: r133341
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r--gcc/tree-ssa.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index a036346dee2..5a67aa8273e 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1416,13 +1416,19 @@ warn_uninit (tree t, const char *gmsgid, void *data)
TREE_NO_WARNING (var) = 1;
}
-
+
+struct walk_data {
+ tree stmt;
+ bool always_executed;
+};
+
/* Called via walk_tree, look for SSA_NAMEs that have empty definitions
and warn about them. */
static tree
-warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
+warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_)
{
+ struct walk_data *data = (struct walk_data *)data_;
tree t = *tp;
switch (TREE_CODE (t))
@@ -1430,7 +1436,12 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
case SSA_NAME:
/* We only do data flow with SSA_NAMEs, so that's all we
can warn about. */
- warn_uninit (t, "%H%qD is used uninitialized in this function", data);
+ if (data->always_executed)
+ warn_uninit (t, "%H%qD is used uninitialized in this function",
+ data->stmt);
+ else
+ warn_uninit (t, "%H%qD may be used uninitialized in this function",
+ data->stmt);
*walk_subtrees = 0;
break;
@@ -1478,14 +1489,21 @@ execute_early_warn_uninitialized (void)
{
block_stmt_iterator bsi;
basic_block bb;
+ struct walk_data data;
+
+ calculate_dominance_info (CDI_POST_DOMINATORS);
FOR_EACH_BB (bb)
- for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
- {
- tree context = bsi_stmt (bsi);
- walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
- context, NULL);
- }
+ {
+ data.always_executed = dominated_by_p (CDI_POST_DOMINATORS,
+ single_succ (ENTRY_BLOCK_PTR), bb);
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ data.stmt = bsi_stmt (bsi);
+ walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
+ &data, NULL);
+ }
+ }
return 0;
}