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:
parent
ad0926324d
commit
758cf3f28a
@ -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
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
20
gcc/testsuite/gcc.dg/tree-ssa/alias-3.c
Normal file
20
gcc/testsuite/gcc.dg/tree-ssa/alias-3.c
Normal 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" } } */
|
||||||
|
|
@ -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;
|
||||||
|
@ -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. */
|
||||||
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user