On Tue, Aug 31, 2021 at 11:26 AM Richard Biener via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > When doing whole-function SLP we have to make sure the recorded > base alignments we compute as the maximum alignment seen for a > base anywhere in the function is actually valid at the point > we want to make use of it. > > To make this work we now record the stmt the alignment was derived > from in addition to the DRs innermost behavior and we use a > dominance check to verify the recorded info is valid when doing > BB vectorization. > > Note this leaves a small(?) hole for the case where we have sth > like > > unaligned DR > call (); // does not return > aligned DR > > since we'll derive an aligned access for the earlier DR but the > later DR is never actually reached since the call does not > return. To plug this hole one option (for the easy backporting) > would be to simply not use the base-alignment recording at all. > Alternatively we'd have to store the dataref grouping 'id' somewhere > in the DR itself and use that to handle this particular case.
It turns out this isn't too difficult so the following is a patch adjusted to cover that case together with a testcase. Bootstrapped and tested on x86_64-unknown-linux-gnu. OK? Thanks, Richard. 2021-08-31 Richard Biener <rguent...@suse.de> PR tree-optimization/102139 * tree-vectorizer.h (vec_base_alignments): Adjust hash-map type to record a std::pair of the stmt-info and the innermost loop behavior. (dr_vec_info::group): New member. * tree-vect-data-refs.c (vect_record_base_alignment): Adjust. (vect_compute_data_ref_alignment): Verify the recorded base alignment can be used. (data_ref_pair): Remove. (dr_group_sort_cmp): Adjust. (vect_analyze_data_ref_accesses): Store the group-ID in the dr_vec_info and operate on a vector of dr_vec_infos. * gcc.dg/torture/pr102139.c: New testcase.
p
Description: Binary data