On Wed, 1 Sep 2021, Richard Sandiford wrote: > 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 :-(
Yeah. > >> 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. We're currently not recording alignment from masked DRs (aka DR_IS_CONDITIONAL_IN_STMT), I suppose we'd need to mark all stmts after early exits in this way then since in the end they will have to be masked on the early exit. So we _might_ be fine there ... Pushed. Thanks, Richard. > 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. > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)