From c29a2c245b4f0837c6cce39d829af5733965e3d3 Mon Sep 17 00:00:00 2001 From: jamborm Date: Mon, 17 May 2010 12:48:34 +0000 Subject: [PATCH] 2010-05-17 Martin Jambor 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. * testsuite/gcc.dg/tree-ssa/pr44133.c: New test. * testsuite/gcc.dg/tree-ssa/sra-9.c: Make the scan regular expression more precise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159482 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 11 ++++++ gcc/testsuite/ChangeLog | 7 ++++ gcc/testsuite/gcc.dg/tree-ssa/pr44133.c | 11 ++++++ gcc/testsuite/gcc.dg/tree-ssa/sra-9.c | 2 +- gcc/tree-sra.c | 51 ++++++++++++++----------- 5 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr44133.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e53fc44d79c6..a5c7d4b10c27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2010-05-17 Martin Jambor + + 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 * function.c (try_fit_stack_local, add_frame_space): New static diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b4d89e027b7d..ba78c98a39df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-05-17 Martin Jambor + + 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 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 000000000000..dfa9ccfef390 --- /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 7a810c644a7e..54f42179e683 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 33144d7f1829..08c03e17781b 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); -- 2.47.2