re PR middle-end/37861 (Bogus array bounds warning)

2008-12-02  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/37861
        * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not check
        for INDIRECT_REFs.
        (forward_propagate_addr_into_variable_array_index): Check that the
        offset is not computed from a MULT_EXPR, use is_gimple_assign rather
        than the gimple code directly.

From-SVN: r142355
This commit is contained in:
Martin Jambor 2008-12-02 15:30:55 +01:00 committed by Martin Jambor
parent 96e4a79fbd
commit d47a01516c
2 changed files with 25 additions and 11 deletions

View File

@ -1,3 +1,12 @@
2008-12-02 Martin Jambor <mjambor@suse.cz>
PR middle-end/37861
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Do not check
for INDIRECT_REFs.
(forward_propagate_addr_into_variable_array_index): Check that the
offset is not computed from a MULT_EXPR, use is_gimple_assign rather
than the gimple code directly.
2008-12-02 Ben Elliston <bje@au.ibm.com>
* config/spu/float_disf.c (__floatdisf): Prototype.

View File

@ -613,19 +613,27 @@ forward_propagate_addr_into_variable_array_index (tree offset,
tree index;
gimple offset_def, use_stmt = gsi_stmt (*use_stmt_gsi);
/* 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. */
/* Get the offset's defining statement. */
offset_def = 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. In that case, however, we do not
allow multiplications because they can be computing index to a higher
level dimension (PR 37861). */
if (integer_onep (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (def_rhs)))))
index = offset;
{
if (is_gimple_assign (offset_def)
&& gimple_assign_rhs_code (offset_def) == MULT_EXPR)
return false;
index = offset;
}
else
{
/* Get the offset's defining statement. */
offset_def = SSA_NAME_DEF_STMT (offset);
/* The statement which defines OFFSET before type conversion
must be a simple GIMPLE_ASSIGN. */
if (gimple_code (offset_def) != GIMPLE_ASSIGN)
if (!is_gimple_assign (offset_def))
return false;
/* The RHS of the statement which defines OFFSET must be a
@ -805,9 +813,6 @@ 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
/* Avoid accessing hidden multidimensional arrays in this way or VRP
might give out bogus warnings (see PR 37861) */
|| TREE_CODE (TREE_OPERAND (array_ref, 0)) == INDIRECT_REF
|| !integer_zerop (TREE_OPERAND (array_ref, 1)))
return false;