Hi,

On Fri, Nov 07, 2008 at 01:05:43PM -0500, DJ Delorie wrote:
> 
> Note that you'll have to build (and install, of course) a
> cross-binutils first, then build a cross-gcc (libgcc will fail to
> build), then cross-build and install newlib, then build cross-gcc
> again (it will work this time) and install it.
> 

Sounds rather complicated, I guess will want to do something like that
one day.  However,  certainly not today.  I thought  about the PR37861
again,  about associated  PR31982  (big thanks  to  Andrew Pinski  who
pointed me to it) and about  the regression you discovered and came to
these conclusions:

1. The regression is most probably "caused" by my patch but the gimple
   it leads to is (as far as I can tell) valid and so the target may
   bump into this problem at some other time.  I am sorry but I do not
   have the knowledge to be bale to help with fixing it.

2. I might actually be less restrictive in my approach.  I've come up
   with the following patch which undoes my previous one and adds a
   different restriction which also fixes PR37861, does not break
   PR31982 and should fix the particular test-case you see regressing
   (however, it is possible that the bug might be triggered in some
   other way, regardless of my patches).  On the other hand, it is a
   bit clumsy and not very systematic :-( I am currently bootstrapping
   and testing it (on x86_64) and will send it to gcc-patches for
   discussion/approval on Monday (or Tuesday) if there are no new
   regressions.

   If you get a chance, can you please test it for me on the affected
   arch?

Thanks,

Martin

2008-11-07  Martin Jambor  <[EMAIL PROTECTED]>

        * 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;
 

Reply via email to