diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0a3fd741af4..50b32453a81 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-06-05 Richard Guenther + + PR tree-optimization/30442 + * tree-vect-data-refs.c (vect_analyze_data_refs): For basic-block + vectorization stop analysis at the first stmt we cannot compute + a data-reference for instead of giving up completely. + 2012-06-05 Richard Guenther * tree-loop-distribution.c (struct partition_s): Add has_writes diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3bfc678473c..e237c41da8d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-06-05 Richard Guenther + + PR tree-optimization/30442 + * gcc.dg/vect/bb-slp-30.c: New testcase. + 2012-06-05 Richard Guenther PR tree-optimization/53081 diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-30.c b/gcc/testsuite/gcc.dg/vect/bb-slp-30.c new file mode 100644 index 00000000000..63689e3434e --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-30.c @@ -0,0 +1,47 @@ +/* { dg-require-effective-target vect_int } */ + +int a[32]; + +void __attribute__((noinline)) +test1(void) +{ + a[0] = 1; + a[1] = 1; + a[2] = 1; + a[3] = 1; + a[4] = 1; + a[5] = 1; + a[6] = 1; + a[7] = 1; + a[8] = 1; + a[9] = 1; + a[10] = 1; + a[11] = 1; + a[12] = 1; + a[13] = 1; + a[14] = 1; + a[15] = 1; + a[16] = 1; + a[17] = 1; + a[18] = 1; + a[19] = 1; + a[20] = 1; + a[21] = 1; + a[22] = 1; + a[23] = 1; + a[24] = 1; + a[25] = 1; + a[26] = 1; + a[27] = 1; + a[28] = 1; + a[29] = 1; + a[30] = 1; + a[31] = 1; + asm ("" : : : "memory"); + a[21] = 0; +} + +int main() { test1(); return a[21]; } + +/* { dg-final { scan-tree-dump-times "basic block vectorized using SLP" 1 "slp" } } */ +/* { dg-final { cleanup-tree-dump "slp" } } */ diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index e34f41a3f1f..aa384d2cadc 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -2844,11 +2844,23 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo, } else { + gimple_stmt_iterator gsi; + bb = BB_VINFO_BB (bb_vinfo); - res = compute_data_dependences_for_bb (bb, true, - &BB_VINFO_DATAREFS (bb_vinfo), - &BB_VINFO_DDRS (bb_vinfo)); - if (!res) + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + if (!find_data_references_in_stmt (NULL, stmt, + &BB_VINFO_DATAREFS (bb_vinfo))) + { + /* Mark the rest of the basic-block as unvectorizable. */ + for (; !gsi_end_p (gsi); gsi_next (&gsi)) + STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (stmt)) = false; + break; + } + } + if (!compute_all_dependences (BB_VINFO_DATAREFS (bb_vinfo), + &BB_VINFO_DDRS (bb_vinfo), NULL, true)) { if (vect_print_dump_info (REPORT_UNVECTORIZED_LOCATIONS)) fprintf (vect_dump, "not vectorized: basic block contains function"