diff options
author | Fei Yang <felix.yang@huawei.com> | 2020-06-12 11:37:00 +0100 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2020-06-12 11:37:00 +0100 |
commit | d30846a02eb9ea43b61311e74fbf05692ffefba2 (patch) | |
tree | ff2094dc7651fb89194c9657397bd7e474fd1f96 /gcc/tree-vect-data-refs.c | |
parent | 135a8ad3a59972ea64b1244b0e221cdded9a6ec6 (diff) | |
download | gcc-d30846a02eb9ea43b61311e74fbf05692ffefba2.zip gcc-d30846a02eb9ea43b61311e74fbf05692ffefba2.tar.gz gcc-d30846a02eb9ea43b61311e74fbf05692ffefba2.tar.bz2 |
vect: Fix an ICE in vect_loop_versioning [PR95570]
In the test case for PR95570, the only data reference in the loop is a
gather-statter access. Scalar evolution analysis for this data reference
failed, so DR_STEP is NULL_TREE. This leads to the segmentation fault.
We should filter out scatter-gather access in vect_enhance_data_refs_alignment.
2020-06-12 Felix Yang <felix.yang@huawei.com>
gcc/
PR tree-optimization/95570
* tree-vect-data-refs.c (vect_relevant_for_alignment_p): New function.
(vect_verify_datarefs_alignment): Call it to filter out data references
in the loop whose alignment is irrelevant.
(vect_get_peeling_costs_all_drs): Likewise.
(vect_peeling_supportable): Likewise.
(vect_enhance_data_refs_alignment): Likewise.
gcc/testsuite/
PR tree-optimization/95570
* gcc.dg/vect/pr95570.c: New test.
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r-- | gcc/tree-vect-data-refs.c | 83 |
1 files changed, 34 insertions, 49 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 39d5a1b..3e86980 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -1129,6 +1129,35 @@ vect_update_misalignment_for_peel (dr_vec_info *dr_info, SET_DR_MISALIGNMENT (dr_info, DR_MISALIGNMENT_UNKNOWN); } +/* Return true if alignment is relevant for DR_INFO. */ + +static bool +vect_relevant_for_alignment_p (dr_vec_info *dr_info) +{ + stmt_vec_info stmt_info = dr_info->stmt; + + if (!STMT_VINFO_RELEVANT_P (stmt_info)) + return false; + + /* For interleaving, only the alignment of the first access matters. */ + if (STMT_VINFO_GROUPED_ACCESS (stmt_info) + && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info) + return false; + + /* Scatter-gather and invariant accesses continue to address individual + scalars, so vector-level alignment is irrelevant. */ + if (STMT_VINFO_GATHER_SCATTER_P (stmt_info) + || integer_zerop (DR_STEP (dr_info->dr))) + return false; + + /* Strided accesses perform only component accesses, alignment is + irrelevant for them. */ + if (STMT_VINFO_STRIDED_P (stmt_info) + && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) + return false; + + return true; +} /* Function verify_data_ref_alignment @@ -1169,20 +1198,7 @@ vect_verify_datarefs_alignment (loop_vec_info vinfo) FOR_EACH_VEC_ELT (datarefs, i, dr) { dr_vec_info *dr_info = vinfo->lookup_dr (dr); - stmt_vec_info stmt_info = dr_info->stmt; - - if (!STMT_VINFO_RELEVANT_P (stmt_info)) - continue; - - /* For interleaving, only the alignment of the first access matters. */ - if (STMT_VINFO_GROUPED_ACCESS (stmt_info) - && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info) - continue; - - /* Strided accesses perform only component accesses, alignment is - irrelevant for them. */ - if (STMT_VINFO_STRIDED_P (stmt_info) - && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) + if (!vect_relevant_for_alignment_p (dr_info)) continue; opt_result res = verify_data_ref_alignment (vinfo, dr_info); @@ -1415,20 +1431,7 @@ vect_get_peeling_costs_all_drs (loop_vec_info loop_vinfo, FOR_EACH_VEC_ELT (datarefs, i, dr) { dr_vec_info *dr_info = loop_vinfo->lookup_dr (dr); - stmt_vec_info stmt_info = dr_info->stmt; - if (!STMT_VINFO_RELEVANT_P (stmt_info)) - continue; - - /* For interleaving, only the alignment of the first access - matters. */ - if (STMT_VINFO_GROUPED_ACCESS (stmt_info) - && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info) - continue; - - /* Strided accesses perform only component accesses, alignment is - irrelevant for them. */ - if (STMT_VINFO_STRIDED_P (stmt_info) - && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) + if (!vect_relevant_for_alignment_p (dr_info)) continue; int save_misalignment; @@ -1548,17 +1551,7 @@ vect_peeling_supportable (loop_vec_info loop_vinfo, dr_vec_info *dr0_info, continue; dr_vec_info *dr_info = loop_vinfo->lookup_dr (dr); - stmt_vec_info stmt_info = dr_info->stmt; - /* For interleaving, only the alignment of the first access - matters. */ - if (STMT_VINFO_GROUPED_ACCESS (stmt_info) - && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info) - continue; - - /* Strided accesses perform only component accesses, alignment is - irrelevant for them. */ - if (STMT_VINFO_STRIDED_P (stmt_info) - && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) + if (!vect_relevant_for_alignment_p (dr_info)) continue; save_misalignment = DR_MISALIGNMENT (dr_info); @@ -2197,21 +2190,13 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo) FOR_EACH_VEC_ELT (datarefs, i, dr) { dr_vec_info *dr_info = loop_vinfo->lookup_dr (dr); - stmt_vec_info stmt_info = dr_info->stmt; - - /* For interleaving, only the alignment of the first access - matters. */ if (aligned_access_p (dr_info) - || (STMT_VINFO_GROUPED_ACCESS (stmt_info) - && DR_GROUP_FIRST_ELEMENT (stmt_info) != stmt_info)) + || !vect_relevant_for_alignment_p (dr_info)) continue; + stmt_vec_info stmt_info = dr_info->stmt; if (STMT_VINFO_STRIDED_P (stmt_info)) { - /* Strided loads perform only component accesses, alignment is - irrelevant for them. */ - if (!STMT_VINFO_GROUPED_ACCESS (stmt_info)) - continue; do_versioning = false; break; } |