aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/alias-3.c20
-rw-r--r--gcc/tree-ssa-alias.c1
-rw-r--r--gcc/tree-ssa-loop-ivopts.c2
-rw-r--r--gcc/tree-ssa-loop.c4
-rw-r--r--gcc/tree-ssa-operands.c13
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)
{