From 863a3781ddf0ec790c6d024c2c4d67515cab388f Mon Sep 17 00:00:00 2001 From: jakub Date: Wed, 29 Jan 2014 09:27:43 +0000 Subject: PR tree-optimization/59594 * tree-vect-data-refs.c (vect_analyze_data_ref_accesses): Sort a copy of the datarefs vector rather than the vector itself. * gcc.dg/vect/no-vfa-vect-depend-2.c: New test. * gcc.dg/vect/no-vfa-vect-depend-3.c: New test. * gcc.dg/vect/pr59594.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207225 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-vect-data-refs.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'gcc/tree-vect-data-refs.c') diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 0deac8177fd..c3e8f372b83 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -2484,19 +2484,21 @@ vect_analyze_data_ref_accesses (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) return true; /* Sort the array of datarefs to make building the interleaving chains - linear. */ - qsort (datarefs.address (), datarefs.length (), + linear. Don't modify the original vector's order, it is needed for + determining what dependencies are reversed. */ + vec datarefs_copy = datarefs.copy (); + qsort (datarefs_copy.address (), datarefs_copy.length (), sizeof (data_reference_p), dr_group_sort_cmp); /* Build the interleaving chains. */ - for (i = 0; i < datarefs.length () - 1;) + for (i = 0; i < datarefs_copy.length () - 1;) { - data_reference_p dra = datarefs[i]; + data_reference_p dra = datarefs_copy[i]; stmt_vec_info stmtinfo_a = vinfo_for_stmt (DR_STMT (dra)); stmt_vec_info lastinfo = NULL; - for (i = i + 1; i < datarefs.length (); ++i) + for (i = i + 1; i < datarefs_copy.length (); ++i) { - data_reference_p drb = datarefs[i]; + data_reference_p drb = datarefs_copy[i]; stmt_vec_info stmtinfo_b = vinfo_for_stmt (DR_STMT (drb)); /* ??? Imperfect sorting (non-compatible types, non-modulo @@ -2573,7 +2575,7 @@ vect_analyze_data_ref_accesses (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) } } - FOR_EACH_VEC_ELT (datarefs, i, dr) + FOR_EACH_VEC_ELT (datarefs_copy, i, dr) if (STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (DR_STMT (dr))) && !vect_analyze_data_ref_access (dr)) { @@ -2588,9 +2590,13 @@ vect_analyze_data_ref_accesses (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo) continue; } else - return false; + { + datarefs_copy.release (); + return false; + } } + datarefs_copy.release (); return true; } -- cgit v1.2.1