c { dg-do compile }
      subroutine sgbcon(norm,n,kl,ku,ab,ldab,ipiv,anorm,rcond,work,iwork
     &,info)
C
C  -- LAPACK routine (version 3.0) --
C     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
C     Courant Institute, Argonne National Lab, and Rice University
C     September 30, 1994
C
C     .. Scalar Arguments ..
      character norm
      integer info,kl,ku,ldab,n
      real anorm,rcond
C     ..
C     .. Array Arguments ..
      integer ipiv(n),iwork(n)
      real ab(ldab,n),work(n)
C     ..
C
C  Purpose
C  =======
C demonstrate g77 bug at -O -funroll-loops
C  =====================================================================
C
C     .. Parameters ..
      real one,zero
      parameter(one= 1.0e+0,zero= 0.0e+0)
C     ..
C     .. Local Scalars ..
      logical lnoti,onenrm
      character normin
      integer ix,j,jp,kase,kase1,kd,lm
      real ainvnm,scale,smlnum,t
C     ..
C     .. External Functions ..
      logical lsame
      integer isamax
      real sdot,slamch
      externallsame,isamax,sdot,slamch
C     ..
C     .. External Subroutines ..
      externalsaxpy,slacon,slatbs,srscl,xerbla
C     ..
C     .. Executable Statements ..
C
C           Multiply by inv(L).
C
      do j= 1,n-1
C the following min() intrinsic provokes this bug
         lm= min(kl,n-j)
         jp= ipiv(j)
         t= work(jp)
         if(jp.ne.j)then
C but only when combined with this if block
            work(jp)= work(j)
            work(j)= t
         endif
C and this subroutine call
         call saxpy(lm,-t,ab(kd+1,j),1,work(j+1),1)
      enddo
      return
      end
