PROGRAM SBCDS
C
C This demonstrates a bug in the PGI Fortran compiler.
C The bug occurs at least in versions 16.1, 16.4, and 16.5
C on Xeon Sandybridge.
C To test:
C 1. Compile: pgfortran -g -fast -o sbcds.fast.x sbcds.F
C 2. Run: ./sbcds.fast.x > sbcds.fast.out.
C 3. Compile: pgfortran -g -fast -Mnovect -o sbcds.novect.x sbcds.F
C 4. Run: ./sbcds.novect.x > sbcds.novect.out.
C 5. cksum sbcds.*.out
C The output files will have different checksums.
C You can also simply diff or xxdiff the output files, they are ASCII.
C The output file produced by "-g -fast" is incorrect,
C the output file produced by "-g -fast -Mnovect" is correct.
C This is an extract from a much larger program, the data here is
C from the larger program and is meaningless without the context
C of that program.
C
IMPLICIT NONE
INTEGER, PARAMETER :: NFBND=90,MXPPF=4
INTEGER :: IPATCH(NFBND)
DATA IPATCH / 4,6,6,6,6,4,6,5,5,5,5,5,4,4,4,6,6,6,6,4,6,5,2,5,
& 2,5,2,5,2,5,4,2,2,2,2,2,4,2,2,2,2,2,4,2,6,2,6,2,
& 6,2,6,2,4,6,2,5,5,5,5,5,4,4,4,6,6,6,6,4,6,5,5,5,
& 5,5,4,4,4,6,6,6,6,4,6,5,5,5,5,5,4,4 /
INTEGER :: IPATCHBC(6)
DATA IPATCHBC / 2,1,2,3,1,1 /
INTEGER :: IPNT(NFBND,MXPPF)
DATA IPNT/0,56,57,58,59,0,60,61,62,63,64,65,0,0,0,71,72,73,74,
& 0,75,76,82,77,83,78,84,79,85,80,0,86,88,89,90,91,0,
& 92,94,95,96,97,0,98,101,100,102,101,103,102,104,103,
& 0,105,104,16,17,18,19,20,0,0,0,26,27,28,29,0,30,31,
& 32,33,34,35,0,0,0,41,42,43,44,0,45,46,47,48,49,50,0,0,
& 0,55,56,57,58,0,59,62,63,64,65,66,0,0,0,70,71,72,73,0,
& 74,77,83,78,84,79,85,80,86,81,0,87,89,90,91,92,0,93,
& 95,96,97,98,0,99,100,101,101,102,102,103,103,104,0,104,
& 105,17,18,19,20,21,0,0,0,25,26,27,28,0,29,32,33,34,35,
& 36,0,0,0,40,41,42,43,0,44,47,48,49,50,51,0,0,0,40,41,
& 42,43,0,44,47,48,49,50,51,0,0,0,55,56,57,58,0,59,62,77,
& 63,78,64,79,65,80,66,0,81,83,84,85,86,0,87,89,90,91,92,
& 0,93,70,95,71,96,72,97,73,98,0,74,99,2,3,4,5,6,0,0,0,
& 10,11,12,13,0,14,17,18,19,20,21,0,0,0,25,26,27,28,0,29,
& 32,33,34,35,36,0,0,0,41,42,43,44,0,45,46,47,48,49,50,0,
& 0,0,56,57,58,59,0,60,61,76,62,77,63,78,64,79,65,0,80,
& 82,83,84,85,0,86,88,89,90,91,0,92,71,94,72,95,73,96,74,
& 97,0,75,98,1,2,3,4,5,0,0,0,11,12,13,14,0,15,16,17,18,
& 19,20,0,0,0,26,27,28,29,0,30,31,32,33,34,35,0,0/
REAL(KIND=8), DIMENSION(6,3) :: PATCHNOR
DATA PATCHNOR/ 0.D0,0.D0, 0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,0.D0,
& 0.D0,1.D0,-1.D0,0.D0,1.D0,0.D0,0.D0,0.D0,0.D0 /
INTEGER, PARAMETER :: NBNDR=105
INTEGER :: INDTOSYMPATCH(NBNDR,3)
INTEGER, PARAMETER :: NUMPPF=4
INTEGER :: IBNODETYPE(NBNDR)
C
INTEGER :: NF,IPCH,MTYPEU,I,INODE,IOTHERP1,IOTHERP2,IERRFLG
C
C
INDTOSYMPATCH(:,:) = 0
IERRFLG = 0
DO NF = 1,NFBND
IPCH = IPATCH(NF)
MTYPEU = IPATCHBC(IPCH)
IF(MTYPEU.NE.1) CYCLE
DO I = 1,NUMPPF
INODE = IPNT(NF,I)
IF (IPCH.EQ.INDTOSYMPATCH(INODE,1) .OR.
. IPCH.EQ.INDTOSYMPATCH(INODE,2) .OR.
. IPCH.EQ.INDTOSYMPATCH(INODE,3)) CYCLE
IF (INDTOSYMPATCH(INODE,1).EQ.0) THEN
INDTOSYMPATCH(INODE,1) = IPCH
ELSEIF (INDTOSYMPATCH(INODE,2).EQ.0) THEN
IOTHERP1 = INDTOSYMPATCH(INODE,1)
IF (PATCHNOR(IPCH,1).EQ.PATCHNOR(IOTHERP1,1) .AND.
. PATCHNOR(IPCH,2).EQ.PATCHNOR(IOTHERP1,2) .AND.
. PATCHNOR(IPCH,3).EQ.PATCHNOR(IOTHERP1,3)) CYCLE
INDTOSYMPATCH(INODE,2) = IPCH
ELSEIF (INDTOSYMPATCH(INODE,3).EQ.0) THEN
IOTHERP1 = INDTOSYMPATCH(INODE,1)
IF (PATCHNOR(IPCH,1).EQ.PATCHNOR(IOTHERP1,1) .AND.
. PATCHNOR(IPCH,2).EQ.PATCHNOR(IOTHERP1,2) .AND.
. PATCHNOR(IPCH,3).EQ.PATCHNOR(IOTHERP1,3)) CYCLE
IOTHERP2 = INDTOSYMPATCH(INODE,2)
IF (PATCHNOR(IPCH,1).EQ.PATCHNOR(IOTHERP2,1) .AND.
. PATCHNOR(IPCH,2).EQ.PATCHNOR(IOTHERP2,2) .AND.
. PATCHNOR(IPCH,3).EQ.PATCHNOR(IOTHERP2,3)) CYCLE
INDTOSYMPATCH(INODE,3) = IPCH
ELSE
IERRFLG = 1
ENDIF
ENDDO
ENDDO
IF (IERRFLG.EQ.1) THEN
WRITE(*,"('ERROR, IERRFLG=',I5)") IERRFLG
ENDIF
C
IBNODETYPE(:) = 0
DO I = 1,NBNDR
IF (INDTOSYMPATCH(I,1).EQ.0) CYCLE
IBNODETYPE(I) = 1
IF (INDTOSYMPATCH(I,2).EQ.0) CYCLE
IBNODETYPE(I) = 2
IF (INDTOSYMPATCH(I,3).EQ.0) CYCLE
IBNODETYPE(I) = 3
ENDDO
C
WRITE(*,"(' I INDTOSYMPATCH(I.1:3) IBNODETYPE(I)')")
DO I = 1,105
WRITE(*,"(5I8)") I,INDTOSYMPATCH(I,1:3),IBNODETYPE(I)
ENDDO
C
C
END PROGRAM SBCDS
We replicated the problem you reported and assigned it TPR 23071.
dave
TPR 23071 - different results for compiling ‘-fast’ versus ‘-fast -novect’ on Sandybridge
has been fixed in the current 17.7 release.
dave