diff options
author | Richard Guenther <rguenther@suse.de> | 2006-01-05 15:30:44 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-01-05 15:30:44 +0000 |
commit | 758cf3f28ab51cee208d52505ed6fb7c1d1b0bd1 (patch) | |
tree | 1be6d45ed8f38489c81824750e671fab251a6b5a /gcc | |
parent | ad0926324df676c7e296d3a3e40c775d5a2b5716 (diff) | |
download | gcc-758cf3f28ab51cee208d52505ed6fb7c1d1b0bd1.zip gcc-758cf3f28ab51cee208d52505ed6fb7c1d1b0bd1.tar.gz gcc-758cf3f28ab51cee208d52505ed6fb7c1d1b0bd1.tar.bz2 |
re PR tree-optimization/22555 (array in struct disables salias subvars for other fields)
2006-01-05 Richard Guenther <rguenther@suse.de>
PR tree-optimization/22555
* tree-ssa-alias.c (create_overlap_variables_for): Do not give up,
if one structure field is an array.
* tree-ssa-operands.c (get_expr_operands): Continue scanning
operands even if we found a subvar, but ignore VOPs in this
case.
* tree-ssa-loop-ivopts.c (rewrite_use): Mark new vars in stmt
for renaming.
* tree-ssa-loop.c (pass_iv_optimize): Schedule TODO_update_ssa.
* gcc.dg/tree-ssa/alias-3.c: New testcase.
From-SVN: r109381
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/alias-3.c | 20 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-loop.c | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 13 |
7 files changed, 51 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b97fb08..026dade 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2006-01-05 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/22555 + * tree-ssa-alias.c (create_overlap_variables_for): Do not give up, + if one structure field is an array. + * tree-ssa-operands.c (get_expr_operands): Continue scanning + operands even if we found a subvar, but ignore VOPs in this + case. + * tree-ssa-loop-ivopts.c (rewrite_use): Mark new vars in stmt + for renaming. + * tree-ssa-loop.c (pass_iv_optimize): Schedule TODO_update_ssa. + 2006-01-05 Richard Earnshaw <rearnsha@arm.com> PR middle-end/24998 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c3c35f1..640c926 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ 2006-01-05 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/22555 + * gcc.dg/tree-ssa/alias-3.c: New testcase. + +2006-01-05 Richard Guenther <rguenther@suse.de> Diego Novillo <dnovillo@redhat.com> * gcc.dg/tree-ssa/loop-11.c: Deal with removed vars pass. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/alias-3.c b/gcc/testsuite/gcc.dg/tree-ssa/alias-3.c new file mode 100644 index 0000000..3d8587d --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/alias-3.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +struct { + int i; + int j; + int x[2]; +} a; + +int foo(void) +{ + a.i = 1; + a.j = 0; + a.x[0] = 0; + return a.i + a.j; +} + +/* { dg-final { scan-tree-dump "return 1;" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 5813a65..ee6a6e6 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2580,7 +2580,6 @@ create_overlap_variables_for (tree var) { if (!fo->size || TREE_CODE (fo->size) != INTEGER_CST - || TREE_CODE (fo->type) == ARRAY_TYPE || fo->offset < 0) { notokay = true; diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 6e7dd61..4c7d645 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -5825,7 +5825,7 @@ rewrite_use (struct ivopts_data *data, default: gcc_unreachable (); } - update_stmt (use->stmt); + mark_new_vars_to_rename (use->stmt); } /* Rewrite the uses using the selected induction variables. */ diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index 34126b1..8565f25 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -432,7 +432,9 @@ struct tree_opt_pass pass_iv_optimize = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func | TODO_verify_loops, /* todo_flags_finish */ + TODO_dump_func + | TODO_verify_loops + | TODO_update_ssa, /* todo_flags_finish */ 0 /* letter */ }; diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 01bf7f2..b7319de 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1126,6 +1126,7 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) { tree ref; HOST_WIDE_INT offset, size, maxsize; + bool none = true; /* This component ref becomes an access to all of the subvariables it can touch, if we can determine that, but *NOT* the real one. If we can't determine which fields we could touch, the recursion @@ -1143,16 +1144,22 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) if (overlap_subvar (offset, maxsize, sv, &exact)) { int subvar_flags = flags; + none = false; if (!exact || size != maxsize) subvar_flags &= ~opf_kill_def; add_stmt_operand (&sv->var, s_ann, subvar_flags); } } + if (!none) + flags |= opf_no_vops; } - else - get_expr_operands (stmt, &TREE_OPERAND (expr, 0), - flags & ~opf_kill_def); + + /* Even if we found subvars above we need to ensure to see + immediate uses for d in s.a[d]. In case of s.a having + a subvar we'd miss it otherwise. */ + get_expr_operands (stmt, &TREE_OPERAND (expr, 0), + flags & ~opf_kill_def); if (code == COMPONENT_REF) { |