[PATCH] Fix PR68639
Richard Biener
rguenther@suse.de
Wed Dec 2 13:18:00 GMT 2015
The testcase shows that we rely on consistently rejecting all group
members from vect_analyze_data_ref_access but that isn't done reliably
when they are not in the same loop level (and thus
nested_in_vect_loop_p doesn't return the same answer for all group
elements). Of course such groups are hardly useful thus the
following patch fixes group detection for this (and not the still
somewhat fragile 'mark this as non-group' code in
vect_analyze_data_ref_access).
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.
Richard.
2015-12-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/68639
* tree-vect-data-refs.c (dr_group_sort_cmp): Split groups
belonging to different loops.
(vect_analyze_data_ref_accesses): Likewise.
* gfortran.fortran-torture/compile/pr68639.f90: New testcase.
Index: gcc/tree-vect-data-refs.c
===================================================================
--- gcc/tree-vect-data-refs.c (revision 231163)
+++ gcc/tree-vect-data-refs.c (working copy)
@@ -2597,6 +2597,12 @@ dr_group_sort_cmp (const void *dra_, con
if (dra == drb)
return 0;
+ /* DRs in different loops never belong to the same group. */
+ loop_p loopa = gimple_bb (DR_STMT (dra))->loop_father;
+ loop_p loopb = gimple_bb (DR_STMT (drb))->loop_father;
+ if (loopa != loopb)
+ return loopa->num < loopb->num ? -1 : 1;
+
/* Ordering of DRs according to base. */
if (!operand_equal_p (DR_BASE_ADDRESS (dra), DR_BASE_ADDRESS (drb), 0))
{
@@ -2688,6 +2694,12 @@ vect_analyze_data_ref_accesses (vec_info
matters we can push those to a worklist and re-iterate
over them. The we can just skip ahead to the next DR here. */
+ /* DRs in a different loop should not be put into the same
+ interleaving group. */
+ if (gimple_bb (DR_STMT (dra))->loop_father
+ != gimple_bb (DR_STMT (drb))->loop_father)
+ break;
+
/* Check that the data-refs have same first location (except init)
and they are both either store or load (not load and store,
not masked loads or stores). */
Index: gcc/testsuite/gfortran.fortran-torture/compile/pr68639.f90
===================================================================
--- gcc/testsuite/gfortran.fortran-torture/compile/pr68639.f90 (revision 0)
+++ gcc/testsuite/gfortran.fortran-torture/compile/pr68639.f90 (working copy)
@@ -0,0 +1,22 @@
+ SUBROUTINE makeCoulE0(natorb,Coul)
+ INTEGER, PARAMETER :: dp=8
+ REAL(KIND=dp), PARAMETER :: fourpi=432.42, oorootpi=13413.3142
+ INTEGER :: natorb
+ REAL(KIND=dp), DIMENSION(45, 45), &
+ INTENT(OUT) :: Coul
+ INTEGER :: gpt, imA, imB, k1, k2, k3, &
+ k4, lp, mp, np
+ REAL(KIND=dp) :: alpha, d2f(3,3), &
+ d4f(3,3,3,3), f, ff, w
+ REAL(KIND=dp), DIMENSION(3, 45) :: M1A
+ REAL(KIND=dp), DIMENSION(45) :: M0A
+ DO imA=1, (natorb*(natorb+1))/2
+ DO imB=1, (natorb*(natorb+1))/2
+ w= M0A(imA)*M0A(imB)
+ DO k1=1,3
+ w=w+ M1A(k1,imA)*M1A(k1,imB)
+ ENDDO
+ Coul(imA,imB)=Coul(imA,imB)-4.0_dp*alpha**3*oorootpi*w/3.0_dp
+ ENDDO
+ ENDDO
+ END SUBROUTINE makeCoulE0
More information about the Gcc-patches
mailing list