diff options
author | Richard Guenther <rguenther@suse.de> | 2008-03-19 10:44:52 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-03-19 10:44:52 +0000 |
commit | 8cb3ee3785019dc4b2566360816f0b83aeea4e2e (patch) | |
tree | c2091432f1378f837c2a13f54a2dd45d2c6b2193 /gcc/tree-ssa.c | |
parent | 21c2d075c06a1b858bd12831dff8ff2786d394fd (diff) | |
download | gcc-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.c | 36 |
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; } |