aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2011-07-19 12:37:03 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2011-07-19 12:37:03 +0000
commit1b14d8150ed4a7194e3d63b262454e9b9446fe95 (patch)
tree385291f03f96ddd5e27e38e3699d4190262d85a3
parentaaa7ad908187c88cf4eeaee10f0af1eb0b73e7f1 (diff)
downloadgcc-1b14d8150ed4a7194e3d63b262454e9b9446fe95.zip
gcc-1b14d8150ed4a7194e3d63b262454e9b9446fe95.tar.gz
gcc-1b14d8150ed4a7194e3d63b262454e9b9446fe95.tar.bz2
re PR tree-optimization/49742 (ICE for gcc.dg/vect/O3-pr39675-2.c on ARM)
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-data-ref.c30
2 files changed, 23 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2982c9b..ee76d11 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index d58542c..97be86c 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -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;
}