diff options
author | Richard Biener <rguenther@suse.de> | 2013-04-02 13:31:05 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-04-02 13:31:05 +0000 |
commit | 90eb75f26e6214dc4e673526952932674e901d8c (patch) | |
tree | d61f3dd52df8a8b6cfa4d150c4f699a8905e0dc3 | |
parent | 8034bcbee6a8de54d29e70aa15671ff9ea297493 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr56778.c | 15 | ||||
-rw-r--r-- | gcc/tree-vect-data-refs.c | 34 | ||||
-rw-r--r-- | gcc/tree-vect-loop-manip.c | 2 |
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); } |