re PR tree-optimization/31982 (Missed forw prop with indirect ref and addr. (and char types or sizeof(type) == 1))
2007-05-24 Richard Guenther <rguenther@suse.de> Andrew Pinski <andrew_pinski@playstation.sony.com> PR tree-optimization/31982 * tree-ssa-forwprop.c (forward_propagate_addr_into_variable_array_index): Handle arrays with element size one. * gcc.dg/tree-ssa/forwprop-2.c: New testcase. Co-Authored-By: Andrew Pinski <andrew_pinski@playstation.sony.com> From-SVN: r125058
This commit is contained in:
parent
3603271035
commit
88efe45a92
4 changed files with 56 additions and 19 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-05-25 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/31982
|
||||
* tree-ssa-forwprop.c
|
||||
(forward_propagate_addr_into_variable_array_index): Handle arrays
|
||||
with element size one.
|
||||
|
||||
2007-05-24 Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
* config/spu/spu.md (smulsi3_highpart): Unshare the rtl chain.
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2007-05-25 Richard Guenther <rguenther@suse.de>
|
||||
Andrew Pinski <andrew_pinski@playstation.sony.com>
|
||||
|
||||
PR tree-optimization/31982
|
||||
* gcc.dg/tree-ssa/forwprop-2.c: New testcase.
|
||||
|
||||
2007-05-25 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/32047
|
||||
|
|
22
gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c
Normal file
22
gcc/testsuite/gcc.dg/tree-ssa/forwprop-2.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-tree-forwprop" } */
|
||||
|
||||
/* We should be able to optimize this to b->t[i] = 1 during
|
||||
early optimizations. */
|
||||
|
||||
struct a
|
||||
{
|
||||
char t[10];
|
||||
};
|
||||
|
||||
struct a *b;
|
||||
|
||||
void f(__SIZE_TYPE__ i)
|
||||
{
|
||||
char *c = b->t;
|
||||
c[i] = 1;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "t\\\[i.*\\\] = 1;" "forwprop1" { xfail *-*-* } } } */
|
||||
/* { dg-final { scan-tree-dump "t\\\[i.*\\\] = 1;" "forwprop2" } } */
|
||||
/* { dg-final { cleanup-tree-dump "forwprop?" } } */
|
|
@ -513,28 +513,30 @@ forward_propagate_addr_into_variable_array_index (tree offset, tree lhs,
|
|||
if (TREE_CODE (offset) != SSA_NAME)
|
||||
return false;
|
||||
|
||||
/* Get the defining statement of the offset before type
|
||||
conversion. */
|
||||
offset = SSA_NAME_DEF_STMT (offset);
|
||||
/* Try to find an expression for a proper index. This is either
|
||||
a multiplication expression by the element size or just the
|
||||
ssa name we came along in case the element size is one. */
|
||||
if (integer_onep (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (lhs)))))
|
||||
index = offset;
|
||||
else
|
||||
{
|
||||
offset = SSA_NAME_DEF_STMT (offset);
|
||||
|
||||
/* The statement which defines OFFSET before type conversion
|
||||
must be a simple GIMPLE_MODIFY_STMT. */
|
||||
if (TREE_CODE (offset) != GIMPLE_MODIFY_STMT)
|
||||
return false;
|
||||
/* The RHS of the statement which defines OFFSET must be a
|
||||
multiplication of an object by the size of the array elements. */
|
||||
if (TREE_CODE (offset) != GIMPLE_MODIFY_STMT)
|
||||
return false;
|
||||
|
||||
/* The RHS of the statement which defines OFFSET must be a
|
||||
multiplication of an object by the size of the array elements.
|
||||
This implicitly verifies that the size of the array elements
|
||||
is constant. */
|
||||
offset = GIMPLE_STMT_OPERAND (offset, 1);
|
||||
if (TREE_CODE (offset) != MULT_EXPR
|
||||
|| TREE_CODE (TREE_OPERAND (offset, 1)) != INTEGER_CST
|
||||
|| !simple_cst_equal (TREE_OPERAND (offset, 1),
|
||||
TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (lhs)))))
|
||||
return false;
|
||||
offset = GIMPLE_STMT_OPERAND (offset, 1);
|
||||
if (TREE_CODE (offset) != MULT_EXPR
|
||||
|| TREE_CODE (TREE_OPERAND (offset, 1)) != INTEGER_CST
|
||||
|| !simple_cst_equal (TREE_OPERAND (offset, 1),
|
||||
TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (lhs)))))
|
||||
return false;
|
||||
|
||||
/* The first operand to the MULT_EXPR is the desired index. */
|
||||
index = TREE_OPERAND (offset, 0);
|
||||
/* The first operand to the MULT_EXPR is the desired index. */
|
||||
index = TREE_OPERAND (offset, 0);
|
||||
}
|
||||
|
||||
/* Replace the pointer addition with array indexing. */
|
||||
GIMPLE_STMT_OPERAND (use_stmt, 1) = unshare_expr (def_rhs);
|
||||
|
|
Loading…
Add table
Reference in a new issue