On Sun, Sep 18, 2011 at 11:00 AM, Ira Rosen <[email protected]> wrote:
> Hi,
>
> Strided accesses of single element or with gaps may require creation
> of epilogue loop. At the moment we don't support peeling for outer
> loops, therefore, we should not allow such strided accesses in outer
> loops.
>
> Bootstrapped and tested on powerpc64-suse-linux.
> Committed to trunk.
>
> Now testing for 4.6.
> OK for 4.6 when the testing completes?
Ok.
Thanks,
Richard.
> Thanks,
> Ira
>
> ChangeLog:
>
> PR tree-optimization/50412
> * tree-vect-data-refs.c (vect_analyze_group_access): Fail for
> acceses that require epilogue loop if vectorizing outer loop.
>
> testsuite/ChangeLog:
>
> PR tree-optimization/50412
> * gfortran.dg/vect/pr50412.f90: New.
>
>
>
> Index: tree-vect-data-refs.c
> ===================================================================
> --- tree-vect-data-refs.c (revision 178939)
> +++ tree-vect-data-refs.c (working copy)
> @@ -2060,7 +2060,11 @@ vect_analyze_group_access (struct data_reference *
> HOST_WIDE_INT dr_step = TREE_INT_CST_LOW (step);
> HOST_WIDE_INT stride, last_accessed_element = 1;
> bool slp_impossible = false;
> + struct loop *loop = NULL;
>
> + if (loop_vinfo)
> + loop = LOOP_VINFO_LOOP (loop_vinfo);
> +
> /* For interleaving, STRIDE is STEP counted in elements, i.e., the
> size of the
> interleaving group (including gaps). */
> stride = dr_step / type_size;
> @@ -2090,11 +2094,18 @@ vect_analyze_group_access (struct data_reference *
>
> if (loop_vinfo)
> {
> - LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) = true;
> -
> if (vect_print_dump_info (REPORT_DETAILS))
> fprintf (vect_dump, "Data access with gaps requires scalar "
> "epilogue loop");
> + if (loop->inner)
> + {
> + if (vect_print_dump_info (REPORT_DETAILS))
> + fprintf (vect_dump, "Peeling for outer loop is not"
> + " supported");
> + return false;
> + }
> +
> + LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) = true;
> }
>
> return true;
> @@ -2277,10 +2288,17 @@ vect_analyze_group_access (struct data_reference *
> /* There is a gap in the end of the group. */
> if (stride - last_accessed_element > 0 && loop_vinfo)
> {
> - LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) = true;
> if (vect_print_dump_info (REPORT_DETAILS))
> fprintf (vect_dump, "Data access with gaps requires scalar "
> "epilogue loop");
> + if (loop->inner)
> + {
> + if (vect_print_dump_info (REPORT_DETAILS))
> + fprintf (vect_dump, "Peeling for outer loop is not
> supported");
> + return false;
> + }
> +
> + LOOP_VINFO_PEELING_FOR_GAPS (loop_vinfo) = true;
> }
> }
> Index: testsuite/gfortran.dg/vect/pr50412.f90
> ===================================================================
> --- testsuite/gfortran.dg/vect/pr50412.f90 (revision 0)
> +++ testsuite/gfortran.dg/vect/pr50412.f90 (revision 0)
> @@ -0,0 +1,12 @@
> +! { dg-do compile }
> +
> + DOUBLE PRECISION AK,AI,AAE
> + COMMON/com/AK(36),AI(4,4),AAE(8,4),ii,jj
> + DO 20 II=1,4
> + DO 21 JJ=1,4
> + AK(n)=AK(n)-AAE(I,II)*AI(II,JJ)
> + 21 CONTINUE
> + 20 CONTINUE
> + END
> +
> +! { dg-final { cleanup-tree-dump "vect" } }
>