Richard Biener <richard.guent...@gmail.com> writes: > 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.
Ah, yeah, the danger of optimisations that silently rely on the then-current restrictions :-( >> 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? TBH I know nothing about this group id scheme, so I'm not really in a position to comment. But it LGTM from the (few) bits I do understand. I guess we're leaving the same easter egg for loop optimisation if we ever support early exits, but I'm not sure what to do about that. Thanks, Richard > > 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.