From 4f7e36ee68ea1ccd6065f94e767d98a270363f0f Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 5 Jan 2006 15:30:44 +0000 Subject: [PATCH] 2006-01-05 Richard Guenther 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109381 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 12 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/alias-3.c | 20 ++++++++++++++++++++ gcc/tree-ssa-alias.c | 1 - gcc/tree-ssa-loop-ivopts.c | 2 +- gcc/tree-ssa-loop.c | 4 +++- gcc/tree-ssa-operands.c | 13 ++++++++++--- 7 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/alias-3.c 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 + + 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 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 + + PR tree-optimization/22555 + * gcc.dg/tree-ssa/alias-3.c: New testcase. + +2006-01-05 Richard Guenther Diego Novillo * 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) { -- 2.7.4