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
This commit is contained in:
Richard Guenther 2006-01-05 15:30:44 +00:00 committed by Richard Biener
parent ad0926324d
commit 758cf3f28a
7 changed files with 51 additions and 6 deletions

View File

@ -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> 2006-01-05 Richard Earnshaw <rearnsha@arm.com>
PR middle-end/24998 PR middle-end/24998

View File

@ -1,3 +1,8 @@
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> 2006-01-05 Richard Guenther <rguenther@suse.de>
Diego Novillo <dnovillo@redhat.com> Diego Novillo <dnovillo@redhat.com>

View File

@ -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" } } */

View File

@ -2580,7 +2580,6 @@ create_overlap_variables_for (tree var)
{ {
if (!fo->size if (!fo->size
|| TREE_CODE (fo->size) != INTEGER_CST || TREE_CODE (fo->size) != INTEGER_CST
|| TREE_CODE (fo->type) == ARRAY_TYPE
|| fo->offset < 0) || fo->offset < 0)
{ {
notokay = true; notokay = true;

View File

@ -5825,7 +5825,7 @@ rewrite_use (struct ivopts_data *data,
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
update_stmt (use->stmt); mark_new_vars_to_rename (use->stmt);
} }
/* Rewrite the uses using the selected induction variables. */ /* Rewrite the uses using the selected induction variables. */

View File

@ -432,7 +432,9 @@ struct tree_opt_pass pass_iv_optimize =
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 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 */ 0 /* letter */
}; };

View File

@ -1126,6 +1126,7 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
{ {
tree ref; tree ref;
HOST_WIDE_INT offset, size, maxsize; HOST_WIDE_INT offset, size, maxsize;
bool none = true;
/* This component ref becomes an access to all of the subvariables /* This component ref becomes an access to all of the subvariables
it can touch, if we can determine that, but *NOT* the real one. 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 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)) if (overlap_subvar (offset, maxsize, sv, &exact))
{ {
int subvar_flags = flags; int subvar_flags = flags;
none = false;
if (!exact if (!exact
|| size != maxsize) || size != maxsize)
subvar_flags &= ~opf_kill_def; subvar_flags &= ~opf_kill_def;
add_stmt_operand (&sv->var, s_ann, subvar_flags); add_stmt_operand (&sv->var, s_ann, subvar_flags);
} }
} }
if (!none)
flags |= opf_no_vops;
} }
else
get_expr_operands (stmt, &TREE_OPERAND (expr, 0), /* Even if we found subvars above we need to ensure to see
flags & ~opf_kill_def); 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) if (code == COMPONENT_REF)
{ {