c { dg-do run } CCC g77 0.5.21 `Actual Bugs': CCC * A code-generation bug afflicts Intel x86 targets when `-O2' is CCC specified compiling, for example, an old version of the `DNRM2' CCC routine. The x87 coprocessor stack is being somewhat mismanaged CCC in cases where assigned `GOTO' and `ASSIGN' are involved. CCC CCC Version 0.5.21 of `g77' contains an initial effort to fix the CCC problem, but this effort is incomplete, and a more complete fix is CCC planned for the next release. C Currently this test fails with (at least) `-O2 -funroll-loops' on C i586-unknown-linux-gnulibc1. C (This is actually an obsolete version of dnrm2 -- consult the c current Netlib BLAS.) integer i double precision a(1:100), dnrm2 do i=1,100 a(i)=0.D0 enddo if (dnrm2(100,a,1) .ne. 0.0) call abort end double precision function dnrm2 ( n, dx, incx) integer i, incx, ix, j, n, next double precision dx(1), cutlo, cuthi, hitest, sum, xmax,zero,one data zero, one /0.0d0, 1.0d0/ data cutlo, cuthi / 8.232d-11, 1.304d19 / j = 0 if(n .gt. 0 .and. incx.gt.0) go to 10 dnrm2 = zero go to 300 10 assign 30 to next ! { dg-warning "ASSIGN" "" } sum = zero i = 1 ix = 1 20 go to next,(30, 50, 70, 110) ! { dg-warning "Assigned GOTO" "" } 30 if( dabs(dx(i)) .gt. cutlo) go to 85 assign 50 to next ! { dg-warning "ASSIGN" "" } xmax = zero 50 if( dx(i) .eq. zero) go to 200 if( dabs(dx(i)) .gt. cutlo) go to 85 assign 70 to next ! { dg-warning "ASSIGN" "" } go to 105 100 continue ix = j assign 110 to next ! { dg-warning "ASSIGN" "" } sum = (sum / dx(i)) / dx(i) 105 xmax = dabs(dx(i)) go to 115 70 if( dabs(dx(i)) .gt. cutlo ) go to 75 110 if( dabs(dx(i)) .le. xmax ) go to 115 sum = one + sum * (xmax / dx(i))**2 xmax = dabs(dx(i)) go to 200 115 sum = sum + (dx(i)/xmax)**2 go to 200 75 sum = (sum * xmax) * xmax 85 hitest = cuthi/float( n ) do 95 j = ix,n if(dabs(dx(i)) .ge. hitest) go to 100 sum = sum + dx(i)**2 i = i + incx 95 continue dnrm2 = dsqrt( sum ) go to 300 200 continue ix = ix + 1 i = i + incx if( ix .le. n ) go to 20 dnrm2 = xmax * dsqrt(sum) 300 continue end