| C Test profile-directed block ordering with various Fortran 77 constructs |
| C to catch basic regressions in the functionality. |
| |
| program bprob1 |
| implicit none |
| integer i,j,k,n |
| integer result |
| integer lpall, ieall, gtall |
| integer lpval, ieval, gtval |
| |
| lpval = lpall() |
| ieval = ieall() |
| gtval = gtall() |
| if ((lpval .ne. 1) .or. (ieval .ne. 1) .or. (gtval .ne. 1)) then |
| call abort |
| end if |
| |
| end |
| |
| C Pass a value through a function to thwart optimization. |
| integer function foo(i) |
| implicit none |
| integer i |
| foo = i |
| end |
| |
| C Test various flavors of GOTO and compare results against expected values. |
| integer function gtall() |
| implicit none |
| integer gt1, gt2, gt3, gt4, gt5 |
| integer gtval |
| |
| gtall = 1 |
| gtval = 0 |
| gtval = gtval + gt1(0) |
| gtval = gtval + gt1(1) |
| if (gtval .ne. 3) then |
| print *,"gtall part 1: ", gtval, 3 |
| gtall = 0 |
| end if |
| |
| gtval = 0 |
| gtval = gtval + gt2(3) |
| gtval = gtval + gt2(30) |
| if (gtval .ne. 12) then |
| print *,"gtall part 2: ", gtval, 12 |
| gtall = 0 |
| end if |
| |
| gtval = 0 |
| gtval = gtval + gt3(0) |
| gtval = gtval + gt3(3) |
| if (gtval .ne. 48) then |
| print *,"gtall part 3: ", gtval, 48 |
| gtall = 0 |
| end if |
| |
| gtval = 0 |
| gtval = gtval + gt4(1) |
| gtval = gtval + gt4(2) |
| gtval = gtval + gt4(3) |
| if (gtval .ne. 14) then |
| print *,"gtall part 4: ", gtval, 14 |
| gtall = 0 |
| end if |
| |
| gtval = 0 |
| gtval = gtval + gt5(0) |
| gtval = gtval + gt5(-1) |
| gtval = gtval + gt5(5) |
| if (gtval .ne. 14) then |
| print *,"gtall part 5: ", gtval, 14 |
| gtall = 0 |
| end if |
| end |
| |
| C Test simple GOTO. |
| integer function gt1(f) |
| implicit none |
| integer f |
| if (f .ne. 0) goto 100 |
| gt1 = 1 |
| goto 101 |
| 100 gt1 = 2 |
| 101 continue |
| end |
| |
| C Test simple GOTO again, this time out of a DO loop. |
| integer function gt2(f) |
| implicit none |
| integer f |
| integer i |
| do i=1,10 |
| if (i .eq. f) goto 100 |
| end do |
| gt2 = 4 |
| goto 101 |
| 100 gt2 = 8 |
| 101 continue |
| end |
| |
| C Test computed GOTO. |
| integer function gt3(i) |
| implicit none |
| integer i |
| gt3 = 8 |
| goto (101, 102, 103, 104), i |
| goto 105 |
| 101 gt3 = 1024 |
| goto 105 |
| 102 gt3 = 2048 |
| goto 105 |
| 103 gt3 = 16 |
| goto 105 |
| 104 gt3 = 4096 |
| goto 105 |
| 105 gt3 = gt3 * 2 |
| end |
| |
| C Test assigned GOTO. |
| integer function gt4(i) |
| implicit none |
| integer i |
| integer label |
| assign 101 to label |
| if (i .eq. 2) assign 102 to label |
| if (i .eq. 3) assign 103 to label |
| goto label, (101, 102, 103) |
| 101 gt4 = 1 |
| goto 104 |
| 102 gt4 = 2 |
| goto 104 |
| 103 gt4 = 4 |
| 104 gt4 = gt4 * 2 |
| end |
| |
| C Test arithmetic IF (bundled with the GOTO variants). |
| integer function gt5(i) |
| implicit none |
| integer i |
| gt5 = 1 |
| if (i) 101, 102, 103 |
| 101 gt5 = 2 |
| goto 104 |
| 102 gt5 = 4 |
| goto 104 |
| 103 gt5 = 8 |
| 104 continue |
| end |
| |
| C Run all of the loop tests and check results against expected values. |
| integer function lpall() |
| implicit none |
| integer loop1, loop2 |
| integer loopval |
| |
| lpall = 1 |
| loopval = 0 |
| loopval = loopval + loop1(1,0) |
| loopval = loopval + loop1(1,2) |
| loopval = loopval + loop1(1,7) |
| if (loopval .ne. 12) then |
| print *,"lpall part 1: ", loopval, 12 |
| lpall = 0 |
| end if |
| |
| loopval = 0 |
| loopval = loopval + loop2(1,0,0,0) |
| loopval = loopval + loop2(1,1,0,0) |
| loopval = loopval + loop2(1,1,3,0) |
| loopval = loopval + loop2(1,1,3,1) |
| loopval = loopval + loop2(1,3,1,5) |
| loopval = loopval + loop2(1,3,7,3) |
| if (loopval .ne. 87) then |
| print *,"lpall part 2: ", loopval, 87 |
| lpall = 0 |
| end if |
| end |
| |
| C Test a simple DO loop. |
| integer function loop1(r,n) |
| implicit none |
| integer r,n,i |
| |
| loop1 = r |
| do i=1,n |
| loop1 = loop1 + 1 |
| end do |
| end |
| |
| C Test nested DO loops. |
| integer function loop2(r, l, m, n) |
| implicit none |
| integer r,l,m,n |
| integer i,j,k |
| loop2 = r |
| do i=1,l |
| do j=1,m |
| do k=1,n |
| loop2 = loop2 + 1 |
| end do |
| end do |
| end do |
| end |
| |
| C Test various combinations of IF-THEN-ELSE and check results against |
| C expected values. |
| integer function ieall() |
| implicit none |
| integer ie1, ie2, ie3 |
| integer ieval |
| ieall = 1 |
| ieval = 0 |
| |
| ieval = ieval + ie1(0,2) |
| ieval = ieval + ie1(0,0) |
| ieval = ieval + ie1(1,2) |
| ieval = ieval + ie1(10,2) |
| ieval = ieval + ie1(11,11) |
| if (ieval .ne. 31) then |
| print *,"ieall part 1: ", ieval, 31 |
| ieall = 0 |
| end if |
| |
| ieval = 0 |
| ieval = ieval + ie2(0) |
| ieval = ieval + ie2(2) |
| ieval = ieval + ie2(2) |
| ieval = ieval + ie2(2) |
| ieval = ieval + ie2(3) |
| ieval = ieval + ie2(3) |
| if (ieval .ne. 23) then |
| print *,"ieall part 2: ", ieval, 23 |
| ieall = 0 |
| end if |
| |
| ieval = 0 |
| ieval = ieval + ie3(11,19) |
| ieval = ieval + ie3(25,27) |
| ieval = ieval + ie3(11,22) |
| ieval = ieval + ie3(11,10) |
| ieval = ieval + ie3(21,32) |
| ieval = ieval + ie3(21,20) |
| ieval = ieval + ie3(1,2) |
| ieval = ieval + ie3(32,31) |
| ieval = ieval + ie3(3,0) |
| ieval = ieval + ie3(0,47) |
| ieval = ieval + ie3(65,65) |
| if (ieval .ne. 246) then |
| print *,"ieall part 3: ", ieval, 246 |
| ieall = 0 |
| end if |
| end |
| |
| C Test IF-THEN-ELSE. |
| integer function ie1(i,j) |
| implicit none |
| integer i,j |
| integer foo |
| |
| ie1 = 0 |
| if (i .ne. 0) then |
| if (j .ne. 0) then |
| ie1 = foo(4) |
| else |
| ie1 = foo(1024) |
| end if |
| else |
| if (j .ne. 0) then |
| ie1 = foo(1) |
| else |
| ie1 = foo(2) |
| end if |
| end if |
| if (i .gt. j) then |
| ie1 = foo(ie1*2) |
| end if |
| if (i .gt. 10) then |
| if (j .gt. 10) then |
| ie1 = foo(ie1*4) |
| end if |
| end if |
| end |
| |
| C Test a series of simple IF-THEN statements. |
| integer function ie2(i) |
| implicit none |
| integer i |
| integer foo |
| ie2 = 0 |
| |
| if (i .eq. 0) then |
| ie2 = foo(1) |
| end if |
| if (i .eq. 1) then |
| ie2 = foo(1024) |
| end if |
| if (i .eq. 2) then |
| ie2 = foo(2) |
| end if |
| if (i .eq. 3) then |
| ie2 = foo(8) |
| end if |
| if (i .eq. 4) then |
| ie2 = foo(2048) |
| end if |
| |
| end |
| |
| C Test nested IF statements and IF with compound expressions. |
| integer function ie3(i,j) |
| implicit none |
| integer i,j |
| integer foo |
| |
| ie3 = 1 |
| if ((i .gt. 10) .and. (j .gt. i) .and. (j .lt. 20)) then |
| ie3 = foo(16) |
| end if |
| if (i .gt. 20) then |
| if (j .gt. i) then |
| if (j .lt. 30) then |
| ie3 = foo(32) |
| end if |
| end if |
| end if |
| if ((i .eq. 3) .or. (j .eq. 47) .or. (i .eq.j)) then |
| ie3 = foo(64) |
| end if |
| end |