This is the vectorizer part of the fix - it makes sure to split load/store groups at stmts that have been marked as not vectorizable.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2016-09-21 Richard Biener <rguent...@suse.de> Jakub Jelinek <ja...@redhat.com> PR tree-optimization/77621 * tree-vect-data-refs.c (vect_analyze_data_ref_accesses): Split group at non-vectorizable stmts. * gcc.dg/pr77621.c: New testcase. Index: gcc/tree-vect-data-refs.c =================================================================== --- gcc/tree-vect-data-refs.c (revision 240255) +++ gcc/tree-vect-data-refs.c (working copy) @@ -2711,10 +2737,17 @@ vect_analyze_data_ref_accesses (vec_info data_reference_p dra = datarefs_copy[i]; stmt_vec_info stmtinfo_a = vinfo_for_stmt (DR_STMT (dra)); stmt_vec_info lastinfo = NULL; + if (! STMT_VINFO_VECTORIZABLE (stmtinfo_a)) + { + ++i; + continue; + } for (i = i + 1; i < datarefs_copy.length (); ++i) { data_reference_p drb = datarefs_copy[i]; stmt_vec_info stmtinfo_b = vinfo_for_stmt (DR_STMT (drb)); + if (! STMT_VINFO_VECTORIZABLE (stmtinfo_b)) + break; /* ??? Imperfect sorting (non-compatible types, non-modulo accesses, same accesses) can lead to a group to be artificially Index: gcc/testsuite/gcc.dg/pr77621.c =================================================================== --- gcc/testsuite/gcc.dg/pr77621.c (revision 0) +++ gcc/testsuite/gcc.dg/pr77621.c (working copy) @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ +/* { dg-additional-options "-mtune=atom -msse2" { target i?86-*-* x86_64-*-* } } */ + +void +foo (double *x, int *y) +{ + int i; + for (i = 0; i < 8; i++) + x[i] -= y[i] * x[i + 1]; +}