OSDN Git Service

2010-04-13 Martin Jambor <mjambor@suse.cz>
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Apr 2010 13:47:34 +0000 (13:47 +0000)
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 13 Apr 2010 13:47:34 +0000 (13:47 +0000)
* tree-sra.c (replace_uses_with_default_def_ssa_name): New function.
(sra_modify_assign): Delete stmts loading dead data even if racc has no
children.  Call replace_uses_with_default_def_ssa_name to handle
SSA_NAES on lhs.

* testsuite/gcc.dg/tree-ssa/sra-9.c: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/sra-9.c [new file with mode: 0644]
gcc/tree-sra.c

index ff7b057..f82bc7a 100644 (file)
@@ -1,3 +1,10 @@
+2010-04-13  Martin Jambor  <mjambor@suse.cz>
+
+       * tree-sra.c (replace_uses_with_default_def_ssa_name): New function.
+       (sra_modify_assign): Delete stmts loading dead data even if racc has no
+       children.  Call replace_uses_with_default_def_ssa_name to handle
+       SSA_NAES on lhs.
+
 2010-04-13  Michael Matz  <matz@suse.de>
 
        PR middle-end/43730
index 5d187a1..dfd16d4 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-13  Martin Jambor  <mjambor@suse.cz>
+
+       * gcc.dg/tree-ssa/sra-9.c: New test.
+
 2010-04-13  Michael Matz  <matz@suse.de>
 
        PR middle-end/43730
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c
new file mode 100644 (file)
index 0000000..7a810c6
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+struct S
+{
+  int a, b, c;
+  int z[20];
+};
+
+int foo (int d)
+{
+  struct S s;
+
+  s.a = d;
+  return s.a + s.b;
+}
+
+/* There should be no reference to s.b.  */
+/* { dg-final { scan-tree-dump-times "s\.b" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index 5653168..0a9b3df 100644 (file)
@@ -2528,6 +2528,37 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi)
     }
 }
 
+/* Create a new suitable default definition SSA_NAME and replace all uses of
+   SSA with it.  */
+
+static void
+replace_uses_with_default_def_ssa_name (tree ssa)
+{
+  tree repl, decl = SSA_NAME_VAR (ssa);
+  if (TREE_CODE (decl) == PARM_DECL)
+    {
+      tree tmp = create_tmp_var (TREE_TYPE (decl), "SR");
+      if (TREE_CODE (TREE_TYPE (tmp)) == COMPLEX_TYPE
+         || TREE_CODE (TREE_TYPE (tmp)) == VECTOR_TYPE)
+       DECL_GIMPLE_REG_P (tmp) = 1;
+
+      get_var_ann (tmp);
+      add_referenced_var (tmp);
+      repl = make_ssa_name (tmp, gimple_build_nop ());
+      set_default_def (tmp, repl);
+    }
+  else
+    {
+      repl = gimple_default_def (cfun, decl);
+      if (!repl)
+       {
+         repl = make_ssa_name (decl, gimple_build_nop ());
+         set_default_def (decl, repl);
+       }
+    }
+
+  replace_uses_by (ssa, repl);
+}
 
 /* Callback of scan_function to process assign statements.  It examines both
    sides of the statement, replaces them with a scalare replacement if there is
@@ -2703,26 +2734,28 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi,
        }
       else
        {
-         if (access_has_children_p (racc))
+         if (racc)
            {
-             if (!racc->grp_unscalarized_data
-                 /* Do not remove SSA name definitions (PR 42704).  */
-                 && TREE_CODE (lhs) != SSA_NAME)
+             if (!racc->grp_to_be_replaced && !racc->grp_unscalarized_data)
                {
-                 generate_subtree_copies (racc->first_child, lhs,
-                                          racc->offset, 0, 0, gsi,
-                                          false, false);
+                 if (racc->first_child)
+                   generate_subtree_copies (racc->first_child, lhs,
+                                            racc->offset, 0, 0, gsi,
+                                            false, false);
                  gcc_assert (*stmt == gsi_stmt (*gsi));
+                 if (TREE_CODE (lhs) == SSA_NAME)
+                   replace_uses_with_default_def_ssa_name (lhs);
+
                  unlink_stmt_vdef (*stmt);
                  gsi_remove (gsi, true);
                  sra_stats.deleted++;
                  return SRA_SA_REMOVED;
                }
-             else
+             else if (racc->first_child)
                generate_subtree_copies (racc->first_child, lhs,
                                         racc->offset, 0, 0, gsi, false, true);
            }
-         else if (access_has_children_p (lacc))
+         if (access_has_children_p (lacc))
            generate_subtree_copies (lacc->first_child, rhs, lacc->offset,
                                     0, 0, gsi, true, true);
        }