Abstract:
An optimization method to be carried out within a digital computer under programmed control for eliminating or removing from a loop body alternate exit tests substantially of the form αi+βcondφ, where α, β and φ are loop invariant expressions, i is the innermost loop index variable, and cond is one of the relational operators (=,≠,&gt;,≧,&lt;,≦). Each alternate exit test is compared to a list of elimination conditions. If an alternate exit test matches one of the elimination conditions, it is eliminated entirely from the loop body. If the alternate exit test cannot be eliminated, it is then compared to a list of restriction conditions. If the alternate exit test matches one of the restriction conditions, the loop index upper bound is modified if necessary and the alternate exit test is moved from inside to outside of the loop body. The resulting altered loop body is near optimum in terms of both the storage area utilized and the program execution time.

Description:
FIELD OF THE INVENTION 
     The present invention generally relates to programmed control in a digital computer for automatically evaluating high level language statements and compiling a set of machine executable instructions from them, and more particularly to an optimization method for eliminating or removing from a loop body alternate exit tests. 
     BACKGROUND OF THE INVENTION 
     Supercomputers are high performance computing platforms that employ a pipelined vector processing approach to solving numerical problems. Vectors are ordered sets of data. Problems that can be structured as a sequence of operations on vectors can experience one to two orders of magnitude increased throughput when executed on a vector machine (compared to execution on a scalar machine of the same cost). Pipelining further increases throughput by hiding memory latency through the prefetching of instructions and data. 
     A pipelined vector machine is disclosed in U.S. Pat. No. 4,128,880, issued Dec. 5, 1978, to Cray, the disclosure of which is hereby incorporated herein by reference. In the Cray machine, vectors are processed by loading them into operand vector registers, streaming them through a data processing pipeline having a functional unit, and receiving the output in a result vector register. A vector machine according to U.S. Pat. No. 4,128,880 supports fully parallel operation by allowing multiple pipelines to execute concurrently on independent streams of data. 
     For vectorizable problems, vector processing is faster and more efficient than scalar processing. Overhead associated with maintenance of the loop-control variable (for example, incrementing and checking the count) is reduced. In addition, central memory conflicts are reduced (fewer but bigger requests) and data processing units are used more efficiently (through data streaming). 
     Vector processing supercomputers are used for a variety of large-scale numerical problems. Applications typically are highly structured computations that model physical processes. They exhibit a heavy dependence on floating-point arithmetic due to the potentially large dynamic range of values within these computations. Problems requiring modeling of heat or fluid flow, or of the behavior of a plasma, are examples of such applications. 
     Program code for execution on vector processing supercomputers must be vectorized to exploit the performance advantages of vector processing. Vectorization typically breaks up a loop of the form: ##EQU1## into a nested loop of the form: ##EQU2## where VL is the length of the vector registers of the system. This process is known as &#34;strip mining the loop&#34;. In strip mining, the number of iterations in the internal loop is defined by the length of a vector register. The number of iterations of the external loop is defined as an integer number of vector lengths. The remaining iterations are performed as a separate loop placed before the nested loop. Vector length arrays of data from the original data arrays are loaded into the vector registers for each iteration of the internal loop. Data from these vector registers can then be processed at the one or more elements per clock period rate of a vector operation. 
     Compilers exist that will automatically apply strip mining techniques to scalar loops within program code to create vectorized loops. This capability greatly simplifies programming efficient vector processing. The programmer simply enters code of the form: ##EQU3## and it is vectorized. 
     There are, however, certain types of operations that inhibit the effectiveness of vectorization. One such operation is the automatic addition of alternate loop exits traditionally associated with array bounds checking. If array bounds checking is enabled, even relatively simple program source statements may generate a large number of alternate exit tests within a loop body because the upper and lower bounds must be checked for each array subscript contained in each program source statement. The presence of a large number of alternate exit tests greatly reduces the efficiency of the loop, and may cause a further loss of performance by preventing a compiler from vectorizing the loop. An equivalent loss of efficiency may also occur with scalar computers. 
     Therefore, there is a need for a method to remove or eliminate alternate exit tests from a loop body without changing the functionality of the loop. 
     SUMMARY OF THE INVENTION 
     The present invention provides an optimization method to be carried out within a digital computer under programmed control for eliminating or removing from a loop body alternate exit tests substantially of the form αi+βcondφ, where α, β and φ are loop invariant expressions, i is the innermost loop index variable, and cond is one of the relational operators (=,≠,&gt;,≧,&lt;,≦). Each alternate exit test is compared to a list of elimination conditions. If an alternate exit test matches one of the elimination conditions, it is eliminated entirely from the loop body. If the alternate exit test cannot be eliminated, it is then compared to a list of restriction conditions. If the alternate exit test matches one of the restriction conditions, the loop index upper bound is modified if necessary and the alternate exit test is moved from inside to outside of the loop body. The resulting altered loop body is near optimum in terms of both the storage area utilized and the program execution time. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 is a diagram representing the system architecture which is compatible with the present invention. 
     FIG. 2 is a general flow diagram representing the method and preferred computer program which is compatible with the present invention. 
    
    
     DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS 
     In the following detailed description of the preferred embodiments, reference is made to the accompanying drawings which form a part hereof, and in which is shown by way of illustration specific embodiments in which the invention may be practiced. It is to be understood that other embodiments may be utilized and structural changes may be made without departing from the scope of the present invention. 
     For the purposes of this description it is assumed that all division operations return results rounded down to the next lowest integer. In addition, all loops are assumed to be normalized by an earlier optimization. A normalized loop is a loop where the index variable runs from zero to some limit by an increment of one. All Fortran DO loops, Ada FOR loops, Pascal FOR loops, and a subset of C loops can be converted to this form, as well as some other restricted loop forms in these languages. 
     FIG. 1 shows the system architecture used to eliminate or remove alternate exit tests from a loop body. A programmed computer 97 uses an optimization program 93 to evaluate program source code 95 and output an optimized program source code 99. 
     FIG. 2 illustrates the method and preferred computer program used to eliminate or remove alternate exit tests from a loop body. An alternate exit test is checked at 101 to see if it is of the form αi+βcondφ. If the alternate exit test is in the mirror image form φcondαi+β, at 103 the alternate exit test is transformed into the form αi+βcondφ by rotating the test around the condition and changing the test from (=,≠,&gt;,≧,&lt;,≦) to (=,≠,&lt;,≦,&gt;,≧), respectively. The alternate exit test may also be in formats other than the mirror image form so long as the format can be transformed into the form αi+βcondφ. 
     
                       TABLE 1.______________________________________Operation   Elimination Condition                         Rule______________________________________=           α = 0, β - φ ≠ 0                         1.1       α &gt; 0, β - φ &gt; 0                         1.2       α &lt; 0, β - φ &lt; 0                         1.3       |α| &gt; 1, (φ - β)modα       ≠ 0         1.4≠     α = 0, β - φ = 0                         1.5&lt;           α ≧ 0, β - φ ≧ 0                         1.6≦    α ≧ 0, β - φ &gt; 0                         1.7&gt;           α ≦ 0, β - φ ≦ 0                         1.8≧    α ≦ 0, β - φ &lt; 0                         1.9______________________________________ 
    
     At 105 the alternate exit test is compared to a list of elimination conditions given in Table 1. If the alternate exit test matches one of the elimination conditions, it is eliminated from the loop at 107. 
     
                       TABLE 2.______________________________________Opera-tion  Restriction Cond. Exit Expression                                 Rule______________________________________=     α = 0, β - φ = 0                   1             2.1 α = 0, (φ - β)modα = 0                   (φ - β)/α + 1                                 2.2 α = 0, β - φ ≠ 0                   ∞       2.3 α = 0, (φ - β)modα ≠ 0                   ∞       2.4≠ β - φ ≠ 0                   1             2.5 α ≠ 0, β - φ = 0                   2             2.6 α = 0, β - φ = 0                   ∞       2.7&lt;     β - φ &lt; 0                   1             2.8 α &lt; 0       (φ - β)/α + 2                                 2.9 α ≧ 0                   ∞       2.10≦ β - φ ≦ 0                   1             2.11 α &lt; 0       (φ - β - 1)/α + 2                                 2.12 α ≧ 0                   ∞       2.13&gt;     β - φ &gt; 0                   1             2.14 α &gt; 0       (φ - β)/α + 2                                 2.15 α ≦ 0                   ∞       2.16≧ β - φ ≧ 0                   1             2.17 α &gt; 0       (φ - β + 1)/α + 2                                 2.18 α ≦ 0                   ∞       2.19______________________________________ 
    
     If at 105 the alternate exit test does not match one of the elimination conditions, it is compared at 109 to a list of restriction conditions given in Table 2. If the alternate exit test matches one of the restriction conditions, a new loop exit iteration value i exit  is calculated at 111 according to a list of exit expression rules given in Table 2, and the alternate exit test is eliminated from the loop at 113. 
     In an alternative embodiment, the elimination and/or restriction conditions may be transformed at 103 into the same form as the alternate exit test that is being evaluated. 
     If at 115 there are additional alternate exit tests to be evaluated, control returns to 101. If at 115 there are no additional alternate exit tests to be evaluated, the value of an existing loop exit upper bounds expression N is compared at 117 to the new loop exit iteration value i exit . If the value of N is less than or equal to i exit , at 119 the value of N is set to i exit  minus two, and at 121 a trailing segment of program code is added after the loop body if necessary. 
     If the loop has constant upper bounds and the value of N is less than or equal to i exit , then none of the evaluated alternate exit tests can be true and therefore it not necessary to add a trailing segment of program code. If the loop has constant upper bounds and the value of N is greater than i exit , then an alternate exit test will always be true before the loop would terminate normally. The loop is modified to run from zero to i exit  minus two, and a trailing segment of program code comprising one iteration from the start of the loop down to the alternate exit test that was true and error handling program code are inserted after the loop body. If the loop has an unknown upper bounds, the loop is modified to run from zero to min(i exit  minus two, N), computed at run time, and a trailing segment of program code comprising one iteration from the start of the loop down to the alternate exit test that was true and error handling program code are inserted after the loop body. A conditional test is placed around the trailing segment of program code so that the trailing segment of program code will only be executed when the value of N is greater than i exit . In both cases, the trailing segment of program code calculates the final partial iteration of the loop before error handling program code is executed. 
     BOUNDS CHECKING EXAMPLE 
     The following example program code fragment comprises a loop to be optimized: 
     
         ______________________________________Define: A(0..479), B(-20..500), C(1..500), D(-2..453)FOR I IN 0..N LOOPA(I+1) :=A(I)+B(I);C(173-I) :=A(I)-1;D(I*2) :=C(350-I*2);END LOOP;______________________________________ 
    
     With bounds checking for each subscript, the loop would typically be converted internally to: 
     
         __________________________________________________________________________Define: A(0..479), B(-20..500), C(1..500), D(-2..453)FOR I IN 0..N LOOPa:  IF I &lt; GOTO OB;Check A(I) lower boundsb:  IF I &gt; 479 GOTO OB;Check A(I) upper boundsc:  IF I &lt; -20 GOTO OB;Check B(I) lower boundsd:  IF I &gt; 500 GOTO OB;Check B(I) upper boundse:  IF I+1 &lt; GOTO OB;Check A(I+1) lower boundsf:  IF I+1 &gt; 479 GOTO OB;Check A(I +1) upper bounds    A(I+1) :=A(I)+B(I);g:  IF I &gt; GOTO OB;Check A(I) lower boundsh:  IF I &gt; 479 GOTO OB;Check A(I) upper boundsi:  IF 173-I &gt; 1 GOTO OB;Check C(173-I) lower boundsj:  IF 173-I &gt; 500 GOTO OB;Check C(173-I) upper bounds    C(173-I) :=A(I)-1;k:  IF 350-I*2 &lt; 1 GOTO OB;Check C(350-I*2) lowerl   IF 350-I*2 &gt; 500 GOTO OB;Check C(350-I*2) upperm:  IF I*2 &lt; -2 GOTO OB;Check D(I*2) lower boundsn:  IF I*2 &gt; 453 GOTO OB;Check D(I*2) upper bounds    D(I*2) :=C(350-I*2);END LOOP;OB: --Out of bounds error exit code__________________________________________________________________________ 
    
     As this example illustrates, a small amount of program code may generate a large number of alternate exit tests when bounds checking is made active. Each of the alternate exit tests is evaluated in turn to see if it may be eliminated or removed from the loop body. 
     Test `a`: α is 1, β is 0, φ is 0, and the condition is &lt;. Rule 1.6 evaluates true, so the test can be eliminated outright (it can never be true). 
     Test `b`: α is 1, β is 0, φ is 479, and the condition is &gt;. Rules 1.1 through 1.9 do not apply, so further evaluation is necessary. Rule 2.14 is not applicable, so rule 2.15 is used to compute i exit  equals (479-0)/1+2, or 481. The test will be true on iteration 481 (when I=480). This information is stored temporarily. 
     Test `c`: α is 1, β is 0, φ is -20, and the condition is &lt;. Rule 1.6 allows this test to be eliminated. 
     Test `d`: α is 1, β is 0, φ is 500, and the condition is &gt;. Rule 2.15 is used to compute i exit  equals (500-0)/1+2, or 502. The test will be true on iteration 502. This information is stored temporarily, but note that test `b` will exit the loop before this test, on iteration 481. 
     Test `e`: α is 1, β is 1, φ is 0, and the condition is &lt;. Rule 1.6 allows this test to be eliminated. 
     Test `f`: α is 1, β is 1, φ is 479, and the condition is &gt;. Rule 2.15 is used to compute i exit  equals (479-1)/1+2, or 480. Note that this is one iteration earlier than test `b`. This information is stored temporarily. 
     Test `g`: This evaluates identically to test `a`, and is eliminated. 
     Test `h`: This evaluates identically to test `b`, and will cause an exit on iteration 481. This information is stored temporarily. 
     Test `i`: α is -1, β is 173, φ is 1, and the condition is &lt;. Rule 1.6 does not apply, rule 2.8 evaluates false, so rule 2.9 is used to compute i exit  equals (1-173)/(-1)+2, or 174. This information is stored temporarily. 
     Test `j`: α is -1, β is 173, φ is 500, and the condition is &gt;. Rule 1.8 allows this test to be eliminated. 
     Test `k`: α is -2, ⊕ is 350, φ is 1, and the condition is &lt;. Rule 2.9 is used to compute i exit  equals (1-350)/(-2)+2, or 176 (division operations are rounded down). This information is stored temporarily. 
     Test `l`: α is -2, β is 350, φ is 500, and the condition is &gt;. Rule 1.8 allows this test to be eliminated. 
     Test `m`: α is 2, β is 0, φ is -2, and the condition is &lt;. Rule 1.6 allows this test to be eliminated. 
     Test `n`: α is 2, β is 0, φ is 453, and the condition is &gt;. Rule 2.15 is used to compute i exit  equals (453-0)/2+2, or 228. This information is stored temporarily. 
     Of the fourteen generated alternate exit tests, seven have been eliminated outright. The first iteration in which the loop will exit is determined by finding the lowest of all the i exit  values, min(481, 502, 480, 481, 174, 176, 228), or iteration 174, which corresponds to test `i`. 
     If the value of the existing loop exit upper bounds expression N is larger than 172, then the abnormal exit would be taken. After a trailing segment of program code comprising an appropriate test and one iteration from the start of the loop down to test `i` are inserted after the loop body, the rewritten loop is: 
     
         ______________________________________   FOR I IN 0..MIN(172,N) LOOP    A(I+1) :=A(I)+B(I);    C(173-I) :=A(I)-1;    D(I*2) :=C(350-I*2);   END LOOP;   IF N &gt; 172 THEN    A(173+1) :=A(173+B(173);    GOTO OB;   END IF;  OB: --Out of bounds error exit code______________________________________ 
    
     PERFORMANCE ANALYSIS 
     Given that each statement of the loop without bounds checking takes λ time, each bounds test takes Δ time, and the loop executes for 172 iterations (plus one partial iteration), then execution time t is: 
     
         t.sub.unoptimized =(3λ+14Δ)×172+λ+6Δ 
    
     
         t.sub.optimized =(3λ)×172+λ+3Δ 
    
     or, 
     
         t.sub.unoptimized =517λ+2414Δ, and t.sub.optimized =517λ+3Δ. 
    
     The amount of overhead required to provide bounds checking has been reduced by 99.88% [(2414-3)/2414], and if a Δ executes in half the time of a λ, then the loop execution time is reduced by approximately 70%. In addition, further performance improvements may arise because the removal of the alternate exit tests from the loop allows for improved scalar and vector optimizations by other methods. 
     The present invention is to be limited only in accordance with the scope of the appended claims, since others skilled in the art may devise other embodiments still within the limits of the claims. The method of optimization described herein may also be applied without loss of generality to scalar or other types of computers.