Fortran compiler bug report

      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