]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/33645 (undefined static variable in vortex for -fno-unit...
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Oct 2007 07:10:22 +0000 (09:10 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 12 Oct 2007 07:10:22 +0000 (09:10 +0200)
PR tree-optimization/33645
* tree-ssa-live.c (mark_all_vars_used): Add data argument,
pass it to walk_tree.
(mark_all_vars_used_1): Pass data through to mark_all_vars_used.
When calling set_is_used on a VAR_DECL, if data is not NULL and
its DECL_UID is in the bitmap, call mark_all_vars_used on its
DECL_INITIAL after clearing the bit in bitmap.
(remove_unused_locals): Adjust mark_all_vars_used callers.
Instead of removing unused global vars from unexpanded_var_list
immediately record them in bitmap, call mark_all_vars_used on
all used global vars from unexpanded_var_list and only purge
global vars that weren't found used even during that step.

* gcc.dg/pr33645-1.c: New test.
* gcc.dg/pr33645-2.c: New test.
* gcc.dg/pr33645-3.c: New test.

From-SVN: r129254

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr33645-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr33645-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr33645-3.c [new file with mode: 0644]
gcc/tree-ssa-live.c

index a5272799e0dd575a05e88299bc92894cc751f1bd..c1f44631d6845e6a7989a116571b736760e55055 100644 (file)
@@ -1,3 +1,18 @@
+2007-10-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/33645
+       * tree-ssa-live.c (mark_all_vars_used): Add data argument,
+       pass it to walk_tree.
+       (mark_all_vars_used_1): Pass data through to mark_all_vars_used.
+       When calling set_is_used on a VAR_DECL, if data is not NULL and
+       its DECL_UID is in the bitmap, call mark_all_vars_used on its
+       DECL_INITIAL after clearing the bit in bitmap.
+       (remove_unused_locals): Adjust mark_all_vars_used callers.
+       Instead of removing unused global vars from unexpanded_var_list
+       immediately record them in bitmap, call mark_all_vars_used on
+       all used global vars from unexpanded_var_list and only purge
+       global vars that weren't found used even during that step.
 2007-10-11  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        * gthr-posix.h (__gthread_active_init): Create detached instead of
index 7434c1e36c971a811d54198fbeea56baf2168567..79626fc11720de8ae03c1e2efd08e58537631dee 100644 (file)
@@ -1,5 +1,10 @@
 2007-10-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/33645
+       * gcc.dg/pr33645-1.c: New test.
+       * gcc.dg/pr33645-2.c: New test.
+       * gcc.dg/pr33645-3.c: New test.
        PR c++/32121
        * g++.dg/ext/label4.C: Adjust error regexp.
        * g++.dg/ext/label6.C: Adjust error regexp.
diff --git a/gcc/testsuite/gcc.dg/pr33645-1.c b/gcc/testsuite/gcc.dg/pr33645-1.c
new file mode 100644 (file)
index 0000000..1ec8a2f
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/33645 */
+/* { dg-do link } */
+/* { dg-options "-O2 -fno-unit-at-a-time" } */
+
+__attribute__((noinline)) int
+bar (int *x)
+{
+  return *x++;
+}
+
+int
+main ()
+{
+  static int var1_s;
+  static int *var1_t = &var1_s;
+
+  return bar (var1_t) != 0;
+}
diff --git a/gcc/testsuite/gcc.dg/pr33645-2.c b/gcc/testsuite/gcc.dg/pr33645-2.c
new file mode 100644 (file)
index 0000000..3c4bcb0
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR tree-optimization/33645 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -funit-at-a-time" } */
+
+__attribute__((noinline)) int
+bar (int *x)
+{
+  return *x++;
+}
+
+int
+main ()
+{
+  static int var1_s;
+  static int *var1_t = &var1_s;
+
+  return bar (var1_t) != 0;
+}
+
+/* { dg-final { scan-assembler-not "var1_t" } } */
diff --git a/gcc/testsuite/gcc.dg/pr33645-3.c b/gcc/testsuite/gcc.dg/pr33645-3.c
new file mode 100644 (file)
index 0000000..28b933c
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR tree-optimization/33645 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-unit-at-a-time" } */
+
+__attribute__((noinline)) int
+bar (int *x)
+{
+  return *x++;
+}
+
+int
+main ()
+{
+  static int var1_s;
+  static int *const var1_t = &var1_s;
+
+  return bar (var1_t) != 0;
+}
+
+/* { dg-final { scan-assembler-not "var1_t" } } */
index a78dd9c19ebbd4820f9d5e7c16348a2000f163d5..f12de815a39d7abb1e2d8d839962d8c589528670 100644 (file)
@@ -397,13 +397,13 @@ change_partition_var (var_map map, tree var, int part)
 }
 
 
-static inline void mark_all_vars_used (tree *);
+static inline void mark_all_vars_used (tree *, void *data);
 
 /* Helper function for mark_all_vars_used, called via walk_tree.  */
 
 static tree
 mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
-                     void *data ATTRIBUTE_UNUSED)
+                     void *data)
 {
   tree t = *tp;
   enum tree_code_class c = TREE_CODE_CLASS (TREE_CODE (t));
@@ -420,9 +420,9 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
      fields that do not contain vars.  */
   if (TREE_CODE (t) == TARGET_MEM_REF)
     {
-      mark_all_vars_used (&TMR_SYMBOL (t));
-      mark_all_vars_used (&TMR_BASE (t));
-      mark_all_vars_used (&TMR_INDEX (t));
+      mark_all_vars_used (&TMR_SYMBOL (t), data);
+      mark_all_vars_used (&TMR_BASE (t), data);
+      mark_all_vars_used (&TMR_INDEX (t), data);
       *walk_subtrees = 0;
       return NULL;
     }
@@ -430,7 +430,14 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
   /* Only need to mark VAR_DECLS; parameters and return results are not
      eliminated as unused.  */
   if (TREE_CODE (t) == VAR_DECL)
-    set_is_used (t);
+    {
+      if (data != NULL && bitmap_bit_p ((bitmap) data, DECL_UID (t)))
+       {
+         bitmap_clear_bit ((bitmap) data, DECL_UID (t));
+         mark_all_vars_used (&DECL_INITIAL (t), data);
+       }
+      set_is_used (t);
+    }
 
   if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
@@ -547,9 +554,9 @@ remove_unused_scope_block_p (tree scope)
    eliminated during the tree->rtl conversion process.  */
 
 static inline void
-mark_all_vars_used (tree *expr_p)
+mark_all_vars_used (tree *expr_p, void *data)
 {
-  walk_tree (expr_p, mark_all_vars_used_1, NULL, NULL);
+  walk_tree (expr_p, mark_all_vars_used_1, data, NULL);
 }
 
 
@@ -562,6 +569,7 @@ remove_unused_locals (void)
   tree t, *cell;
   referenced_var_iterator rvi;
   var_ann_t ann;
+  bitmap global_unused_vars = NULL;
 
   mark_scope_block_unused (DECL_INITIAL (current_function_decl));
   /* Assume all locals are unused.  */
@@ -576,7 +584,7 @@ remove_unused_locals (void)
 
       /* Walk the statements.  */
       for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
-       mark_all_vars_used (bsi_stmt_ptr (bsi));
+       mark_all_vars_used (bsi_stmt_ptr (bsi), NULL);
 
       for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
         {
@@ -588,17 +596,17 @@ remove_unused_locals (void)
            continue;
 
           def = PHI_RESULT (phi);
-          mark_all_vars_used (&def);
+         mark_all_vars_used (&def, NULL);
 
           FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_ALL_USES)
             {
              tree arg = USE_FROM_PTR (arg_p);
-             mark_all_vars_used (&arg);
+             mark_all_vars_used (&arg, NULL);
             }
         }
     }
 
-  /* Remove unmarked vars and clear used flag.  */
+  /* Remove unmarked local vars from unexpanded_var_list.  */
   for (cell = &cfun->unexpanded_var_list; *cell; )
     {
       tree var = TREE_VALUE (*cell);
@@ -607,12 +615,49 @@ remove_unused_locals (void)
          && (!(ann = var_ann (var))
              || !ann->used))
        {
-         *cell = TREE_CHAIN (*cell);
-         continue;
+         if (is_global_var (var))
+           {
+             if (global_unused_vars == NULL)
+               global_unused_vars = BITMAP_ALLOC (NULL);
+             bitmap_set_bit (global_unused_vars, DECL_UID (var));
+           }
+         else
+           {
+             *cell = TREE_CHAIN (*cell);
+             continue;
+           }
        }
       cell = &TREE_CHAIN (*cell);
     }
 
+  /* Remove unmarked global vars from unexpanded_var_list.  */
+  if (global_unused_vars != NULL)
+    {
+      for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t))
+       {
+         tree var = TREE_VALUE (t);
+
+         if (TREE_CODE (var) == VAR_DECL
+             && is_global_var (var)
+             && (ann = var_ann (var)) != NULL
+             && ann->used)
+           mark_all_vars_used (&DECL_INITIAL (var), global_unused_vars);
+       }
+
+      for (cell = &cfun->unexpanded_var_list; *cell; )
+       {
+         tree var = TREE_VALUE (*cell);
+
+         if (TREE_CODE (var) == VAR_DECL
+             && is_global_var (var)
+             && bitmap_bit_p (global_unused_vars, DECL_UID (var)))
+           *cell = TREE_CHAIN (*cell);
+         else
+           cell = &TREE_CHAIN (*cell);
+       }
+      BITMAP_FREE (global_unused_vars);
+    }
+
   /* Remove unused variables from REFERENCED_VARs.  As a special
      exception keep the variables that are believed to be aliased.
      Those can't be easily removed from the alias sets and operand