From: rguenth Date: Sun, 29 Mar 2009 17:54:04 +0000 (+0000) Subject: 2009-03-29 Richard Guenther X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=088cc5d52e3bab879a7b3aa48b3de9127e948bb0;p=pf3gnuchains%2Fgcc-fork.git 2009-03-29 Richard Guenther * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly propagate addresses of array references. * gcc.dg/tree-ssa/forwprop-11.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145250 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f9b9c14a40..4766e21c994 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-03-29 Richard Guenther + + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly + propagate addresses of array references. + 2009-03-29 Steven Bosscher * regmove.c (perhaps_ends_bb_p): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f264b33f301..0807892c743 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-03-29 Richard Guenther + + * gcc.dg/tree-ssa/forwprop-11.c: New testcase. + 2009-03-29 Daniel Kraft PR fortran/37423 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-11.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-11.c new file mode 100644 index 00000000000..eaaa6dd4e24 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-11.c @@ -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" } } */ diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index fb29f91bbf1..859d6fe6172 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -828,19 +828,20 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, array_ref = TREE_OPERAND (def_rhs, 0); if (TREE_CODE (array_ref) != ARRAY_REF || 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; rhs2 = gimple_assign_rhs2 (use_stmt); - /* Try to optimize &x[0] p+ C where C is a multiple of the size - of the elements in X into &x[C/element size]. */ + /* Try to optimize &x[C1] p+ C2 where C2 is a multiple of the size + of the elements in X into &x[C1 + C2/element size]. */ if (TREE_CODE (rhs2) == INTEGER_CST) { tree new_rhs = maybe_fold_stmt_addition (gimple_expr_type (use_stmt), - array_ref, rhs2); + def_rhs, rhs2); 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); update_stmt (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 type for the arithmetic. */ if (TREE_CODE (rhs2) == SSA_NAME + && integer_zerop (TREE_OPERAND (array_ref, 1)) && useless_type_conversion_p (TREE_TYPE (name), TREE_TYPE (def_rhs)) /* Avoid problems with IVopts creating PLUS_EXPRs with a different type than their operands. */