aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-04-02 13:31:05 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-04-02 13:31:05 +0000
commit90eb75f26e6214dc4e673526952932674e901d8c (patch)
treed61f3dd52df8a8b6cfa4d150c4f699a8905e0dc3
parent8034bcbee6a8de54d29e70aa15671ff9ea297493 (diff)
downloadgcc-90eb75f26e6214dc4e673526952932674e901d8c.zip
gcc-90eb75f26e6214dc4e673526952932674e901d8c.tar.gz
gcc-90eb75f26e6214dc4e673526952932674e901d8c.tar.bz2
re PR tree-optimization/56778 (ICE on several benchmarks after r196775.)
2013-04-02 Richard Biener <rguenther@suse.de> PR tree-optimization/56778 * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): Runtime alias tests are not supported for gather loads. * tree-vect-loop-manip.c (vect_loop_versioning): Insert stmts referenced from SSA operands before updating SSA form. * gcc.dg/torture/pr56778.c: New testcase. From-SVN: r197355
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr56778.c15
-rw-r--r--gcc/tree-vect-data-refs.c34
-rw-r--r--gcc/tree-vect-loop-manip.c2
5 files changed, 63 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f7155c0..d18c6e9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2013-04-02 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/56778
+ * tree-vect-data-refs.c (vect_analyze_data_ref_dependence):
+ Runtime alias tests are not supported for gather loads.
+ * tree-vect-loop-manip.c (vect_loop_versioning): Insert
+ stmts referenced from SSA operands before updating SSA form.
+
2013-04-02 Ian Caulfield <ian.caulfield@arm.com>
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9b17672..1a8055d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-04-02 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/56778
+ * gcc.dg/torture/pr56778.c: New testcase.
+
+2013-04-02 Richard Biener <rguenther@suse.de>
+
PR middle-end/56768
* g++.dg/torture/pr56768.C: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr56778.c b/gcc/testsuite/gcc.dg/torture/pr56778.c
new file mode 100644
index 0000000..4806877
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr56778.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=core-avx2" { target x86_64-*-* } } */
+
+typedef struct {
+ float a,b,c;
+} S;
+
+S * arr[100];
+
+void bar (float *in[], int n)
+{
+ int i;
+ for (i=0; i<n; i++)
+ (*in)[i] = -arr[i]->b;
+}
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 188581f..4ef9ba8 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -280,6 +280,23 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
/* Unknown data dependence. */
if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
{
+ if (STMT_VINFO_GATHER_P (stmtinfo_a)
+ || STMT_VINFO_GATHER_P (stmtinfo_b))
+ {
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "versioning for alias not supported for: "
+ "can't determine dependence between ");
+ dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ DR_REF (dra));
+ dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+ dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ DR_REF (drb));
+ }
+ return false;
+ }
+
if (dump_enabled_p ())
{
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -299,6 +316,23 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
/* Known data dependence. */
if (DDR_NUM_DIST_VECTS (ddr) == 0)
{
+ if (STMT_VINFO_GATHER_P (stmtinfo_a)
+ || STMT_VINFO_GATHER_P (stmtinfo_b))
+ {
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "versioning for alias not supported for: "
+ "bad dist vector for ");
+ dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ DR_REF (dra));
+ dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+ dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+ DR_REF (drb));
+ }
+ return false;
+ }
+
if (dump_enabled_p ())
{
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index b0120a9..a158c62 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -2476,11 +2476,11 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
/* End loop-exit-fixes after versioning. */
- update_ssa (TODO_update_ssa);
if (cond_expr_stmt_list)
{
cond_exp_gsi = gsi_last_bb (condition_bb);
gsi_insert_seq_before (&cond_exp_gsi, cond_expr_stmt_list,
GSI_SAME_STMT);
}
+ update_ssa (TODO_update_ssa);
}