Message ID | CAKSNEw7SdqkwPdvBreywy3dxHJz_R4mGLqtLf8qhy5_=w4LW7w@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Sun, Sep 18, 2011 at 11:00 AM, Ira Rosen <ira.rosen@linaro.org> 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" } } >
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" } }