diff options
Diffstat (limited to 'gcc/tree-vect-stmts.c')
-rw-r--r-- | gcc/tree-vect-stmts.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 96dd191691b..361c312d891 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -4369,6 +4369,20 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, return false; } + /* Invalidate assumptions made by dependence analysis when vectorization + on the unrolled body effectively re-orders stmts. */ + if (ncopies > 1 + && STMT_VINFO_MIN_NEG_DIST (stmt_info) != 0 + && ((unsigned)LOOP_VINFO_VECT_FACTOR (loop_vinfo) + > STMT_VINFO_MIN_NEG_DIST (stmt_info))) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "cannot perform implicit CSE when unrolling " + "with negative dependence distance\n"); + return false; + } + if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) return false; @@ -4425,6 +4439,20 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt, else if (!vect_grouped_load_supported (vectype, group_size)) return false; } + + /* Invalidate assumptions made by dependence analysis when vectorization + on the unrolled body effectively re-orders stmts. */ + if (!PURE_SLP_STMT (stmt_info) + && STMT_VINFO_MIN_NEG_DIST (stmt_info) != 0 + && ((unsigned)LOOP_VINFO_VECT_FACTOR (loop_vinfo) + > STMT_VINFO_MIN_NEG_DIST (stmt_info))) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "cannot perform implicit CSE when performing " + "group loads with negative dependence distance\n"); + return false; + } } |