2008-03-19 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Mar 2008 10:44:52 +0000 (10:44 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Mar 2008 10:44:52 +0000 (10:44 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133341 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/uninit-15.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/uninit-16.c [new file with mode: 0644]
gcc/tree-ssa.c

index d3601a7..0dc711d 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2008-03-18  Mikulas Patocka  <mikulas@artax.karlin.mff.cuni.cz>
 
        PR target/35504
index 6a30392..2aacfe4 100644 (file)
@@ -1,3 +1,9 @@
+2008-03-19  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/35609
+       * gcc.dg/testsuite/uninit-15.c: New testcase.
+       * gcc.dg/testsuite/uninit-16.c: Likewise.
+
 2008-03-18  Mikulas Patocka  <mikulas@artax.karlin.mff.cuni.cz>
 
        PR target/35504
diff --git a/gcc/testsuite/gcc.dg/uninit-15.c b/gcc/testsuite/gcc.dg/uninit-15.c
new file mode 100644 (file)
index 0000000..dee7a3b
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O -Wuninitialized" } */
+
+inline int foo (int i)
+{
+    if (i) return 1; /* { dg-warning "is used uninitialized" } */
+    return 0;
+}
+
+void baz();
+
+void bar()
+{
+    int j;           /* { dg-message "was declared here" } */
+    for (; foo(j); ++j)
+        baz();
+}
diff --git a/gcc/testsuite/gcc.dg/uninit-16.c b/gcc/testsuite/gcc.dg/uninit-16.c
new file mode 100644 (file)
index 0000000..aefb5e5
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+int foo, bar;
+
+void decode_reloc(int reloc, int *is_alt)
+{
+  if (reloc >= 20)
+      *is_alt = 1;
+  else if (reloc >= 10)
+      *is_alt = 0;
+}
+
+void testfunc()
+{
+  int alt_reloc;
+
+  decode_reloc(foo, &alt_reloc);
+
+  if (alt_reloc) /* { dg-warning "may be used uninitialized" } */
+    bar = 42;
+}
index a036346..5a67aa8 100644 (file)
@@ -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;
 }