aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@linux.alibaba.com>2019-03-26 11:12:37 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-03-26 11:12:37 +0000
commitf30d4934a90a6121674d882d391dc09d8fce190c (patch)
treedceaf13c79931e68028dfe72926292485c514420 /gcc/tree-vect-data-refs.c
parenta235c72e64a2ec26d63d614e3d1ce12a7e061201 (diff)
downloadgcc-f30d4934a90a6121674d882d391dc09d8fce190c.zip
gcc-f30d4934a90a6121674d882d391dc09d8fce190c.tar.gz
gcc-f30d4934a90a6121674d882d391dc09d8fce190c.tar.bz2
re PR tree-optimization/81740 (wrong code at -O3 in both 32-bit and 64-bit modes on x86_64-linux-gnu)
2019-03-26 Bin Cheng <bin.cheng@linux.alibaba.com> PR tree-optimization/81740 * tree-vect-data-refs.c (vect_analyze_data_ref_dependence): In case of outer loop vectorization, check for backward dependence at the inner loop if outer loop dependence is reversed. * gcc.dg/vect/pr81740-1.c: New testcase. * gcc.dg/vect/pr81740-2.c: Likewise. From-SVN: r269938
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 7bbd47f..1380088 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -473,8 +473,22 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
reversed (to make distance vector positive), and the actual
distance is negative. */
if (dump_enabled_p ())
- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ dump_printf_loc (MSG_NOTE, vect_location,
"dependence distance negative.\n");
+ /* When doing outer loop vectorization, we need to check if there is
+ a backward dependence at the inner loop level if the dependence
+ at the outer loop is reversed. See PR81740. */
+ if (nested_in_vect_loop_p (loop, stmtinfo_a)
+ || nested_in_vect_loop_p (loop, stmtinfo_b))
+ {
+ unsigned inner_depth = index_in_loop_nest (loop->inner->num,
+ DDR_LOOP_NEST (ddr));
+ if (dist_v[inner_depth] < 0)
+ return opt_result::failure_at (stmtinfo_a->stmt,
+ "not vectorized, dependence "
+ "between data-refs %T and %T\n",
+ DR_REF (dra), DR_REF (drb));
+ }
/* Record a negative dependence distance to later limit the
amount of stmt copying / unrolling we can perform.
Only need to handle read-after-write dependence. */
@@ -490,7 +504,7 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
{
/* The dependence distance requires reduction of the maximal
vectorization factor. */
- *max_vf = abs (dist);
+ *max_vf = abs_dist;
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location,
"adjusting maximal vectorization factor to %i\n",