mirror of git://gcc.gnu.org/git/gcc.git
tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly propagate addresses of array references.
2009-03-29 Richard Guenther <rguenther@suse.de> * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly propagate addresses of array references. * gcc.dg/tree-ssa/forwprop-11.c: New testcase. From-SVN: r145250
This commit is contained in:
parent
b0e5fa9401
commit
5babbcc0fc
|
|
@ -1,3 +1,8 @@
|
||||||
|
2009-03-29 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
|
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly
|
||||||
|
propagate addresses of array references.
|
||||||
|
|
||||||
2009-03-29 Steven Bosscher <steven@gcc.gnu.org>
|
2009-03-29 Steven Bosscher <steven@gcc.gnu.org>
|
||||||
|
|
||||||
* regmove.c (perhaps_ends_bb_p): Remove.
|
* regmove.c (perhaps_ends_bb_p): Remove.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
2009-03-29 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
|
* gcc.dg/tree-ssa/forwprop-11.c: New testcase.
|
||||||
|
|
||||||
2009-03-29 Daniel Kraft <d@domob.eu>
|
2009-03-29 Daniel Kraft <d@domob.eu>
|
||||||
|
|
||||||
PR fortran/37423
|
PR fortran/37423
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O -fdump-tree-forwprop1" } */
|
||||||
|
|
||||||
|
int f(int *p, int n)
|
||||||
|
{
|
||||||
|
int (*a)[n] = (int (*)[n])p;
|
||||||
|
int *q = &(*a)[0];
|
||||||
|
return q[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
int g(int *p, int n)
|
||||||
|
{
|
||||||
|
int (*a)[n] = (int (*)[n])p;
|
||||||
|
int *q = &(*a)[2];
|
||||||
|
return q[-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* { dg-final { scan-tree-dump-times "= \\\(\\\*a_..\\\)\\\[1\\\];" 2 "forwprop1" } } */
|
||||||
|
/* { dg-final { cleanup-tree-dump "forwprop1" } } */
|
||||||
|
|
@ -828,19 +828,20 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
||||||
array_ref = TREE_OPERAND (def_rhs, 0);
|
array_ref = TREE_OPERAND (def_rhs, 0);
|
||||||
if (TREE_CODE (array_ref) != ARRAY_REF
|
if (TREE_CODE (array_ref) != ARRAY_REF
|
||||||
|| TREE_CODE (TREE_TYPE (TREE_OPERAND (array_ref, 0))) != ARRAY_TYPE
|
|| TREE_CODE (TREE_TYPE (TREE_OPERAND (array_ref, 0))) != ARRAY_TYPE
|
||||||
|| !integer_zerop (TREE_OPERAND (array_ref, 1)))
|
|| TREE_CODE (TREE_OPERAND (array_ref, 1)) != INTEGER_CST)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
rhs2 = gimple_assign_rhs2 (use_stmt);
|
rhs2 = gimple_assign_rhs2 (use_stmt);
|
||||||
/* Try to optimize &x[0] p+ C where C is a multiple of the size
|
/* Try to optimize &x[C1] p+ C2 where C2 is a multiple of the size
|
||||||
of the elements in X into &x[C/element size]. */
|
of the elements in X into &x[C1 + C2/element size]. */
|
||||||
if (TREE_CODE (rhs2) == INTEGER_CST)
|
if (TREE_CODE (rhs2) == INTEGER_CST)
|
||||||
{
|
{
|
||||||
tree new_rhs = maybe_fold_stmt_addition (gimple_expr_type (use_stmt),
|
tree new_rhs = maybe_fold_stmt_addition (gimple_expr_type (use_stmt),
|
||||||
array_ref, rhs2);
|
def_rhs, rhs2);
|
||||||
if (new_rhs)
|
if (new_rhs)
|
||||||
{
|
{
|
||||||
gimple_assign_set_rhs_from_tree (use_stmt_gsi, new_rhs);
|
gimple_assign_set_rhs_from_tree (use_stmt_gsi,
|
||||||
|
unshare_expr (new_rhs));
|
||||||
use_stmt = gsi_stmt (*use_stmt_gsi);
|
use_stmt = gsi_stmt (*use_stmt_gsi);
|
||||||
update_stmt (use_stmt);
|
update_stmt (use_stmt);
|
||||||
tidy_after_forward_propagate_addr (use_stmt);
|
tidy_after_forward_propagate_addr (use_stmt);
|
||||||
|
|
@ -853,6 +854,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
||||||
array elements, then the result is converted into the proper
|
array elements, then the result is converted into the proper
|
||||||
type for the arithmetic. */
|
type for the arithmetic. */
|
||||||
if (TREE_CODE (rhs2) == SSA_NAME
|
if (TREE_CODE (rhs2) == SSA_NAME
|
||||||
|
&& integer_zerop (TREE_OPERAND (array_ref, 1))
|
||||||
&& useless_type_conversion_p (TREE_TYPE (name), TREE_TYPE (def_rhs))
|
&& useless_type_conversion_p (TREE_TYPE (name), TREE_TYPE (def_rhs))
|
||||||
/* Avoid problems with IVopts creating PLUS_EXPRs with a
|
/* Avoid problems with IVopts creating PLUS_EXPRs with a
|
||||||
different type than their operands. */
|
different type than their operands. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue