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.

Reply via email to