re PR tree-optimization/46190 (ICE in vect_enhance_data_refs_alignment when building fma3d)

2010-11-03  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/46190
	* tree-vect-data-refs.c (vect_enhance_data_refs_alignment):
	Properly compute peel iterations.

	* gfortran.dg/pr46190.f90: New testcase.

From-SVN: r166244
This commit is contained in:
Richard Guenther 2010-11-03 13:30:48 +00:00 committed by Richard Biener
parent 623238466c
commit 8b8bba2dd9
4 changed files with 79 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2010-11-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46190
* tree-vect-data-refs.c (vect_enhance_data_refs_alignment):
Properly compute peel iterations.
2010-11-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46286

View File

@ -1,3 +1,8 @@
2010-11-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46190
* gfortran.dg/pr46190.f90: New testcase.
2010-11-03 Richard Guenther <rguenther@suse.de>
PR testsuite/46274

View File

@ -0,0 +1,64 @@
! { dg-do compile }
! { dg-options "-O2 -ftree-vectorize" }
TYPE :: spot_weld_type
CHARACTER(8) PLACE ! Keyword "NODE" or "POSITION"
END TYPE
TYPE (spot_weld_type), DIMENSION(:), ALLOCATABLE :: SPOT_WELD
INTEGER, PARAMETER :: LSRT = 12 ! Length of sorted-element-distance array
INTEGER &
& IETYP(LSRT) ! -/- Sort array for closest el's, 0/1=tri/qu
REAL(KIND(0D0)) &
& DSQRD(LSRT) ! -/- Sort array for closest el's, d**2
LOGICAL &
& COINCIDENT, &
& INSIDE_ELEMENT
IF (SPOT_WELD(NSW)%PLACE .EQ. 'POSITION') THEN
DO n = 1,LSRT
ENDDO
DO i = 1,NUMP3
DO WHILE (Distance_Squared .GT. DSQRD(n) .AND. n .LE. LSRT)
ENDDO
IF (n .LT. LSRT) THEN
DO k = LSRT-1,n,-1
DSQRD(k+1) = DSQRD(k)
IETYP(k+1) = IETYP(k)
ENDDO
ENDIF
DO n = 1,LSRT
IF (IETYP(n) .EQ. 0) THEN
INSIDE_ELEMENT = &
& Xi1EL(n) .GE. 0.0 .AND. Xi2EL(n) .GE. 0.0
IF (DSQRD(n) .LT. Dmin) THEN
ENDIF
ENDIF
ENDDO
ENDDO
IF (Icount .GT. 0) THEN
DO i = 1,Icount
CALL USER_MESSAGE &
& ( &
& )
ENDDO
CALL USER_MESSAGE &
& ( &
& )
ENDIF
IF &
& ( &
& .NOT.COINCIDENT &
& ) &
& THEN
IF (NP1 .GT. 0) THEN
IF (NP1 .GT. 0) THEN
ENDIF
ENDIF
ENDIF
IF (.NOT.COINCIDENT) THEN
DO i = 1,3
IF (NP(i) .GT. 0) THEN
ENDIF
ENDDO
ENDIF
ENDIF
END

View File

@ -1518,7 +1518,8 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
mis = DR_MISALIGNMENT (dr) / GET_MODE_SIZE (TYPE_MODE (
TREE_TYPE (DR_REF (dr))));
npeel_tmp = (negative
? (mis - nelements) : (nelements - mis)) & (vf - 1);
? (mis - nelements) : (nelements - mis))
& (nelements - 1);
/* For multiple types, it is possible that the bigger type access
will have more than one peeling option. E.g., a loop with two
@ -1722,7 +1723,8 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
count. */
mis = DR_MISALIGNMENT (dr0);
mis /= GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr0))));
npeel = (negative ? mis - nelements : nelements - mis) & (vf - 1);
npeel = ((negative ? mis - nelements : nelements - mis)
& (nelements - 1));
}
/* For interleaved data access every iteration accesses all the