From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29861 invoked by alias); 10 Nov 2008 10:07:56 -0000 Received: (qmail 11785 invoked by uid 48); 10 Nov 2008 10:06:33 -0000 Date: Mon, 10 Nov 2008 10:07:00 -0000 Message-ID: <20081110100633.11784.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug middle-end/37861] [4.3 Regression] Bogus array bounds warning In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "jamborm at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2008-11/txt/msg00692.txt.bz2 ------- Comment #8 from jamborm at gcc dot gnu dot org 2008-11-10 10:06 ------- The previous patch resulted into a regression on m32c-unknown-elf and thus I prepared a less intrusive one below. See also: * http://gcc.gnu.org/ml/gcc/2008-11/msg00058.html and * http://gcc.gnu.org/ml/gcc-patches/2008-11/msg00353.html The patch is pending approval in the mailing list. 2008-11-07 Martin Jambor * 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. Index: gcc/tree-ssa-forwprop.c =================================================================== --- gcc/tree-ssa-forwprop.c (revision 141673) +++ gcc/tree-ssa-forwprop.c (working copy) @@ -613,19 +613,27 @@ forward_propagate_addr_into_variable_arr 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; - else { - /* Get the offset's defining statement. */ - offset_def = SSA_NAME_DEF_STMT (offset); + if (is_gimple_assign (offset_def) + && gimple_assign_rhs_code (offset_def) == MULT_EXPR) + return false; + index = offset; + } + else + { /* 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 @@ -802,9 +810,6 @@ forward_propagate_addr_expr_1 (tree name 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; -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861