On Fri, Jul 20, 2018 at 3:57 AM Richard Sandiford <richard.sandif...@arm.com> wrote: > > We could vectorise: > > for (...) > { > a[0] = ...; > a[1] = ...; > a[2] = ...; > a[3] = ...; > a += stride; > } > > (including the case when stride == 8) but not: > > for (...) > { > a[0] = ...; > a[1] = ...; > a[2] = ...; > a[3] = ...; > a += 8; > } > > (where the stride is always 8). The former was treated as a "grouped > and strided" store, while the latter was treated as grouped store with > gaps, which we don't support. > > This patch makes us treat groups of stores with gaps at the end as > strided groups too. I tried to go through all uses of STMT_VINFO_STRIDED_P > and all vector uses of DR_STEP to see whether there were any hard-baked > assumptions, but couldn't see any. I wondered whether we should relax: > > /* We do not have to consider dependences between accesses that belong > to the same group, unless the stride could be smaller than the > group size. */ > if (DR_GROUP_FIRST_ELEMENT (stmtinfo_a) > && (DR_GROUP_FIRST_ELEMENT (stmtinfo_a) > == DR_GROUP_FIRST_ELEMENT (stmtinfo_b)) > && !STMT_VINFO_STRIDED_P (stmtinfo_a)) > return false; > > for cases in which the step is constant and the absolute step is known > to be greater than the group size, but data dependence analysis should > already return chrec_known for those cases. > > The new test is a version of vect-avg-15.c with the variable step > replaced by a constant one. > > A natural follow-on would be to do the same for groups with gaps in > the middle: > > /* Check that the distance between two accesses is equal to the type > size. Otherwise, we have gaps. */ > diff = (TREE_INT_CST_LOW (DR_INIT (data_ref)) > - TREE_INT_CST_LOW (prev_init)) / type_size; > if (diff != 1) > { > [...] > if (DR_IS_WRITE (data_ref)) > { > if (dump_enabled_p ()) > dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, > "interleaved store with gaps\n"); > return false; > } > > But I think we should do that separately and see what the fallout > from this change is first. > > Tested on aarch64-linux-gnu (with and without SVE), aarch64_be-elf > and x86_64-linux-gnu. OK to install? > > Richard > > > 2018-07-20 Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > * tree-vect-data-refs.c (vect_analyze_group_access_1): Convert > grouped stores with gaps to a strided group. >
This patch caused: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87214 H.J.