re PR tree-optimization/49742 (ICE for gcc.dg/vect/O3-pr39675-2.c on ARM)
authorRichard Sandiford <richard.sandiford@linaro.org>
Tue, 19 Jul 2011 12:37:03 +0000 (12:37 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 19 Jul 2011 12:37:03 +0000 (12:37 +0000)
gcc/
PR tree-optimization/49742
* tree-data-ref.c (get_references_in_stmt): Treat the lhs of a call
as a potential write.

From-SVN: r176446

gcc/ChangeLog
gcc/tree-data-ref.c

index 2982c9bc13005060511510492e8638ed0a5a04a6..ee76d11065a83036dffa0878b8099b58ad559db6 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-19  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR tree-optimization/49742
+       * tree-data-ref.c (get_references_in_stmt): Treat the lhs of a call
+       as a potential write.
+
 2011-07-19  Richard Guenther  <rguenther@suse.de>
 
        * gimplify.c (gimplify_expr): Gimplify TRUTH_NOT_EXPR as
index d58542c91cae622dada11eccd4130c948c51d8ff..97be86c406d0c019178f43b7ed6dc706388fd2cc 100644 (file)
@@ -4158,33 +4158,37 @@ get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references)
          ref->pos = op1;
          ref->is_read = true;
        }
-
-      if (DECL_P (*op0)
-         || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
-       {
-         ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
-         ref->pos = op0;
-         ref->is_read = false;
-       }
     }
   else if (stmt_code == GIMPLE_CALL)
     {
-      unsigned i, n = gimple_call_num_args (stmt);
+      unsigned i, n;
 
+      op0 = gimple_call_lhs_ptr (stmt);
+      n = gimple_call_num_args (stmt);
       for (i = 0; i < n; i++)
        {
-         op0 = gimple_call_arg_ptr (stmt, i);
+         op1 = gimple_call_arg_ptr (stmt, i);
 
-         if (DECL_P (*op0)
-             || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0)))
+         if (DECL_P (*op1)
+             || (REFERENCE_CLASS_P (*op1) && get_base_address (*op1)))
            {
              ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
-             ref->pos = op0;
+             ref->pos = op1;
              ref->is_read = true;
            }
        }
     }
+  else
+    return clobbers_memory;
 
+  if (*op0
+      && (DECL_P (*op0)
+         || (REFERENCE_CLASS_P (*op0) && get_base_address (*op0))))
+    {
+      ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
+      ref->pos = op0;
+      ref->is_read = false;
+    }
   return clobbers_memory;
 }