aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr44133.c11
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/sra-9.c2
-rw-r--r--gcc/tree-sra.c51
5 files changed, 59 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e53fc44..a5c7d4b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2010-05-17 Martin Jambor <mjambor@suse.cz>
+
+ PR middle-end/44133
+ * tree-sra.c (create_access_replacement): New parameter rename, mark
+ the replaement for renaming only when it is true.
+ (get_access_replacement): Pass true in the rename parameter of
+ create_access_replacement.
+ (get_unrenamed_access_replacement): New function.
+ (replace_uses_with_default_def_ssa_name): New parameter racc, get the
+ replacement declaration from it.
+
2010-05-17 Bernd Schmidt <bernds@codesourcery.com>
* function.c (try_fit_stack_local, add_frame_space): New static
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b4d89e02..ba78c98 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2010-05-17 Martin Jambor <mjambor@suse.cz>
+
+ PR middle-end/44133
+ * gcc.dg/tree-ssa/pr44133.c: New test.
+ * gcc.dg/tree-ssa/sra-9.c: Make the scan regular expression more
+ precise.
+
2010-05-17 Janus Weil <janus@gcc.gnu.org>
PR fortran/44044
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c b/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c
new file mode 100644
index 0000000..dfa9ccf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+struct S { int i, j; };
+
+int foo (int l)
+{
+ struct S s;
+ s.j = l - 22; /* { dg-warning ".s\.i. is used uninitialized" } */
+ return s.i + s.j;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c
index 7a810c6..54f4217 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c
@@ -16,5 +16,5 @@ int foo (int d)
}
/* There should be no reference to s.b. */
-/* { dg-final { scan-tree-dump-times "s\.b" 0 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "= s\.b" 0 "optimized"} } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 33144d7..08c03e1 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1586,14 +1586,15 @@ sort_and_splice_var_accesses (tree var)
ACCESS->replacement. */
static tree
-create_access_replacement (struct access *access)
+create_access_replacement (struct access *access, bool rename)
{
tree repl;
repl = create_tmp_var (access->type, "SR");
get_var_ann (repl);
add_referenced_var (repl);
- mark_sym_for_renaming (repl);
+ if (rename)
+ mark_sym_for_renaming (repl);
if (!access->grp_partial_lhs
&& (TREE_CODE (access->type) == COMPLEX_TYPE
@@ -1669,10 +1670,24 @@ get_access_replacement (struct access *access)
gcc_assert (access->grp_to_be_replaced);
if (!access->replacement_decl)
- access->replacement_decl = create_access_replacement (access);
+ access->replacement_decl = create_access_replacement (access, true);
return access->replacement_decl;
}
+/* Return ACCESS scalar replacement, create it if it does not exist yet but do
+ not mark it for renaming. */
+
+static inline tree
+get_unrenamed_access_replacement (struct access *access)
+{
+ gcc_assert (!access->grp_to_be_replaced);
+
+ if (!access->replacement_decl)
+ access->replacement_decl = create_access_replacement (access, false);
+ return access->replacement_decl;
+}
+
+
/* Build a subtree of accesses rooted in *ACCESS, and move the pointer in the
linked list along the way. Stop when *ACCESS is NULL or the access pointed
to it is not "within" the root. */
@@ -2507,29 +2522,21 @@ 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. */
+ SSA with it, RACC is access describing the uninitialized part of an
+ aggregate that is being loaded. */
static void
-replace_uses_with_default_def_ssa_name (tree ssa)
+replace_uses_with_default_def_ssa_name (tree ssa, struct access *racc)
{
- tree repl, decl = SSA_NAME_VAR (ssa);
- if (TREE_CODE (decl) == PARM_DECL)
- {
- tree tmp = create_tmp_reg (TREE_TYPE (decl), "SR");
+ tree repl, decl;
- get_var_ann (tmp);
- add_referenced_var (tmp);
- repl = make_ssa_name (tmp, gimple_build_nop ());
- set_default_def (tmp, repl);
- }
- else
+ decl = get_unrenamed_access_replacement (racc);
+
+ repl = gimple_default_def (cfun, decl);
+ if (!repl)
{
- repl = gimple_default_def (cfun, decl);
- if (!repl)
- {
- repl = make_ssa_name (decl, gimple_build_nop ());
- set_default_def (decl, repl);
- }
+ repl = make_ssa_name (decl, gimple_build_nop ());
+ set_default_def (decl, repl);
}
replace_uses_by (ssa, repl);
@@ -2717,7 +2724,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
false, false);
gcc_assert (*stmt == gsi_stmt (*gsi));
if (TREE_CODE (lhs) == SSA_NAME)
- replace_uses_with_default_def_ssa_name (lhs);
+ replace_uses_with_default_def_ssa_name (lhs, racc);
unlink_stmt_vdef (*stmt);
gsi_remove (gsi, true);