| Submitter | Martin Jambor |
|---|---|
| Date | June 16, 2010, 4:47 p.m. |
| Message ID | <20100616164740.GC19794@virgil.suse.cz> |
| Download | mbox | patch |
| Permalink | /patch/55914/ |
| State | New |
| Headers | show |
Comments
Ping. (I have re-bootrapped and re-tested on today's branch). Thanks, Martin On Wed, Jun 16, 2010 at 06:47:41PM +0200, Martin Jambor wrote: > Hi, > > the fix for PR 44133 I committed to trunk depends on a previous 4.6 > only patch http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00440.html > which is an enhancement to SRA deleting register-type loads from parts > of aggregates that are known not to be initialized. > > The easiest way to fix the bug on the branch would therefore be to > backport the enhancement and then the fix on top of it. I believe the > both changes is sufficiently small to ask the release managers for a > permission to do just that. > > BTW, the bug manifests itself differently from what was happening > since the enhancement was committed, there simply is no warning > emitted which is a regression from 4.4. > > The 4.5 versions of the two patches are below. Right now I am in the > process of bootstrapping and testing them. Is it OK to commit them to > the 4.5 branch if there are no issues? > > Thanks, > > Martin > > > 2010-06-16 Martin Jambor <mjambor@suse.cz> > > Backport from mainline > 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. > > * testsuite/gcc.dg/tree-ssa/sra-9.c: New test. > > Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c > =================================================================== > --- /dev/null > +++ gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c > @@ -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: gcc-4_5-branch/gcc/tree-sra.c > =================================================================== > --- gcc-4_5-branch.orig/gcc/tree-sra.c > +++ gcc-4_5-branch/gcc/tree-sra.c > @@ -2555,6 +2555,37 @@ sra_modify_constructor_assign (gimple *s > } > } > > +/* 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 > @@ -2730,26 +2761,28 @@ sra_modify_assign (gimple *stmt, gimple_ > } > 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); > } > > > > 2010-06-16 Martin Jambor <mjambor@suse.cz> > > Backport from mainline > 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. > > * testsuite/gcc.dg/tree-ssa/pr44133.c: New test. > > Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c > =================================================================== > --- /dev/null > +++ gcc-4_5-branch/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; > +} > Index: gcc-4_5-branch/gcc/tree-sra.c > =================================================================== > --- gcc-4_5-branch.orig/gcc/tree-sra.c > +++ gcc-4_5-branch/gcc/tree-sra.c > @@ -1659,14 +1659,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 > @@ -1715,7 +1716,20 @@ get_access_replacement (struct access *a > 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; > } > > @@ -2556,32 +2570,21 @@ sra_modify_constructor_assign (gimple *s > } > > /* 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_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 > + tree repl, decl; > + > + 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); > @@ -2771,7 +2774,7 @@ sra_modify_assign (gimple *stmt, gimple_ > 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);
On Mon, 28 Jun 2010, Martin Jambor wrote: > Ping. (I have re-bootrapped and re-tested on today's branch). Ok. Thanks, Richard. > Thanks, > > Martin > > On Wed, Jun 16, 2010 at 06:47:41PM +0200, Martin Jambor wrote: > > Hi, > > > > the fix for PR 44133 I committed to trunk depends on a previous 4.6 > > only patch http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00440.html > > which is an enhancement to SRA deleting register-type loads from parts > > of aggregates that are known not to be initialized. > > > > The easiest way to fix the bug on the branch would therefore be to > > backport the enhancement and then the fix on top of it. I believe the > > both changes is sufficiently small to ask the release managers for a > > permission to do just that. > > > > BTW, the bug manifests itself differently from what was happening > > since the enhancement was committed, there simply is no warning > > emitted which is a regression from 4.4. > > > > The 4.5 versions of the two patches are below. Right now I am in the > > process of bootstrapping and testing them. Is it OK to commit them to > > the 4.5 branch if there are no issues? > > > > Thanks, > > > > Martin > > > > > > 2010-06-16 Martin Jambor <mjambor@suse.cz> > > > > Backport from mainline > > 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. > > > > * testsuite/gcc.dg/tree-ssa/sra-9.c: New test. > > > > Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c > > =================================================================== > > --- /dev/null > > +++ gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c > > @@ -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: gcc-4_5-branch/gcc/tree-sra.c > > =================================================================== > > --- gcc-4_5-branch.orig/gcc/tree-sra.c > > +++ gcc-4_5-branch/gcc/tree-sra.c > > @@ -2555,6 +2555,37 @@ sra_modify_constructor_assign (gimple *s > > } > > } > > > > +/* 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 > > @@ -2730,26 +2761,28 @@ sra_modify_assign (gimple *stmt, gimple_ > > } > > 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); > > } > > > > > > > > 2010-06-16 Martin Jambor <mjambor@suse.cz> > > > > Backport from mainline > > 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. > > > > * testsuite/gcc.dg/tree-ssa/pr44133.c: New test. > > > > Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c > > =================================================================== > > --- /dev/null > > +++ gcc-4_5-branch/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; > > +} > > Index: gcc-4_5-branch/gcc/tree-sra.c > > =================================================================== > > --- gcc-4_5-branch.orig/gcc/tree-sra.c > > +++ gcc-4_5-branch/gcc/tree-sra.c > > @@ -1659,14 +1659,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 > > @@ -1715,7 +1716,20 @@ get_access_replacement (struct access *a > > 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; > > } > > > > @@ -2556,32 +2570,21 @@ sra_modify_constructor_assign (gimple *s > > } > > > > /* 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_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 > > + tree repl, decl; > > + > > + 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); > > @@ -2771,7 +2774,7 @@ sra_modify_assign (gimple *stmt, gimple_ > > 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); > >
Patch
Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c =================================================================== --- /dev/null +++ gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/sra-9.c @@ -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: gcc-4_5-branch/gcc/tree-sra.c =================================================================== --- gcc-4_5-branch.orig/gcc/tree-sra.c +++ gcc-4_5-branch/gcc/tree-sra.c @@ -2555,6 +2555,37 @@ sra_modify_constructor_assign (gimple *s } } +/* 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 @@ -2730,26 +2761,28 @@ sra_modify_assign (gimple *stmt, gimple_ } 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); } 2010-06-16 Martin Jambor <mjambor@suse.cz> Backport from mainline 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. * testsuite/gcc.dg/tree-ssa/pr44133.c: New test. Index: gcc-4_5-branch/gcc/testsuite/gcc.dg/tree-ssa/pr44133.c =================================================================== --- /dev/null +++ gcc-4_5-branch/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; +} Index: gcc-4_5-branch/gcc/tree-sra.c =================================================================== --- gcc-4_5-branch.orig/gcc/tree-sra.c +++ gcc-4_5-branch/gcc/tree-sra.c @@ -1659,14 +1659,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 @@ -1715,7 +1716,20 @@ get_access_replacement (struct access *a 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; } @@ -2556,32 +2570,21 @@ sra_modify_constructor_assign (gimple *s } /* 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_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 + tree repl, decl; + + 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); @@ -2771,7 +2774,7 @@ sra_modify_assign (gimple *stmt, gimple_ 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);
Hi, the fix for PR 44133 I committed to trunk depends on a previous 4.6 only patch http://gcc.gnu.org/ml/gcc-patches/2010-04/msg00440.html which is an enhancement to SRA deleting register-type loads from parts of aggregates that are known not to be initialized. The easiest way to fix the bug on the branch would therefore be to backport the enhancement and then the fix on top of it. I believe the both changes is sufficiently small to ask the release managers for a permission to do just that. BTW, the bug manifests itself differently from what was happening since the enhancement was committed, there simply is no warning emitted which is a regression from 4.4. The 4.5 versions of the two patches are below. Right now I am in the process of bootstrapping and testing them. Is it OK to commit them to the 4.5 branch if there are no issues? Thanks, Martin 2010-06-16 Martin Jambor <mjambor@suse.cz> Backport from mainline 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. * testsuite/gcc.dg/tree-ssa/sra-9.c: New test.