Cem Akgok <[email protected]> writes:

> vectorizable_induction reduces the number of generated SLP induction
> IVs when group_size is evenly divisible by const_nunits. Existing
> code did this without checking that the vector chunks being folded have
> the same scalar initial values and steps with their counterparts.
> If either differed, reusing an earlier IV produced wrong code.
>
> Compute the unreduced IV count first and use the reduced count only when
> each folded chunk has initial values and steps equal to its corresponding
> earlier chunk. When initial values come from an SLP node and their scalar
> values are unavailable, conservatively keep the unreduced count.
>
> Added tests for mismatched initial values, mismatched steps, and a valid
> multi-IV reuse pattern.
>
> gcc/ChangeLog:
>
>       * tree-vect-loop.cc (vect_slp_induction_reuse_p): New function.
>       (vectorizable_induction): Validate SLP induction IV reuse.  Reuse
>       generated IVs cyclically when filling the SLP group.
>
> gcc/testsuite/ChangeLog:
>
>       * gcc.dg/vect/vect-iv-12.c: New test.
>       * gcc.dg/vect/vect-iv-13.c: New test.
>       * gcc.dg/vect/vect-iv-14.c: New test.
>
> Signed-off-by: Cem Akgok <[email protected]>
> ---
> Godbolt: https://godbolt.org/z/Mbohx7sEn
> Wrong code at -O2.
> All major versions from 11 to trunk affected. (11 miscompiles at -O3 only)
> Compiles correctly with -fno-tree-loop-vectorize.

Can you file a bug report for this too please? Any fix will need backporting.

sam

Attachment: signature.asc
Description: PGP signature

Reply via email to