]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/38723 (default definitions not in avail_out)
authorRichard Guenther <rguenther@suse.de>
Sat, 28 Mar 2009 17:17:57 +0000 (17:17 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 28 Mar 2009 17:17:57 +0000 (17:17 +0000)
2009-03-28  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/38723
* tree-ssa-pre.c (compute_avail): Add all default definitions to
the entry block.

* gcc.dg/tree-ssa/ssa-fre-22.c: New testcase.

From-SVN: r145197

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-22.c [new file with mode: 0644]
gcc/tree-ssa-pre.c

index aff4c852338a00edadf2da256cf93e60b03229de..8dfd7e918caf516b01a1c6d1285f1b140afa7957 100644 (file)
@@ -1,3 +1,9 @@
+2009-03-28  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/38723
+       * tree-ssa-pre.c (compute_avail): Add all default definitions to
+       the entry block.
+
 2009-03-28  Jan Hubicka  <jh@suse.cz>
 
        * tree-ssa-structalias.c (ipa_pta_execute): Fix bogus node->analyzed
index 961d0d6bb1c33d8bf30cde5545cfc857e0d4e64e..09a33ef84417401c818ef9685b20e4e0c16db95d 100644 (file)
@@ -1,3 +1,8 @@
+2009-03-28  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/38723
+       * gcc.dg/tree-ssa/ssa-fre-22.c: New testcase.
+
 2009-03-28  Paul Thomas  <pault@gcc.gnu.org
 
         PR fortran/38538
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-22.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-22.c
new file mode 100644 (file)
index 0000000..ce311b6
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre" } */
+
+int i;
+int foo (void)
+{
+  int j;
+  i = j;
+  return i;
+}
+
+/* We should eliminate the redundant load of i.  */
+
+/* { dg-final { scan-tree-dump-not "= i;" "fre" } } */
+/* { dg-final { cleanup-tree-dump "fre" } } */
index 18c442e6371376b393949dfb199345bd9e043980..9d06a8a3f297b7523dcc5a9ad517881a1564426a 100644 (file)
@@ -3564,46 +3564,28 @@ compute_avail (void)
   basic_block block, son;
   basic_block *worklist;
   size_t sp = 0;
-  tree param;
+  unsigned i;
 
-  /* For arguments with default definitions, we pretend they are
-     defined in the entry block.  */
-  for (param = DECL_ARGUMENTS (current_function_decl);
-       param;
-       param = TREE_CHAIN (param))
+  /* We pretend that default definitions are defined in the entry block.
+     This includes function arguments and the static chain decl.  */
+  for (i = 1; i < num_ssa_names; ++i)
     {
-      if (gimple_default_def (cfun, param) != NULL)
-       {
-         tree def = gimple_default_def (cfun, param);
-         pre_expr e = get_or_alloc_expr_for_name (def);
-
-         add_to_value (get_expr_value_id (e), e);
-         if (!in_fre)
-           {
-             bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
-             bitmap_value_insert_into_set (maximal_set, e);
-           }
-         bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
-       }
-    }
+      tree name = ssa_name (i);
+      pre_expr e;
+      if (!name
+         || !SSA_NAME_IS_DEFAULT_DEF (name)
+         || has_zero_uses (name)
+         || !is_gimple_reg (name))
+       continue;
 
-  /* Likewise for the static chain decl. */
-  if (cfun->static_chain_decl)
-    {
-      param = cfun->static_chain_decl;
-      if (gimple_default_def (cfun, param) != NULL)
+      e = get_or_alloc_expr_for_name (name);
+      add_to_value (get_expr_value_id (e), e);
+      if (!in_fre)
        {
-         tree def = gimple_default_def (cfun, param);
-         pre_expr e = get_or_alloc_expr_for_name (def);
-
-         add_to_value (get_expr_value_id (e), e);
-         if (!in_fre)
-           {
-             bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
-             bitmap_value_insert_into_set (maximal_set, e);
-           }
-         bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
+         bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
+         bitmap_value_insert_into_set (maximal_set, e);
        }
+      bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
     }
 
   /* Allocate the worklist.  */