-- THIS TEST EVALUATES THE CODE EFFICIENCY OF A LOOP STATEMENT WITH THE
-- FOR ITERATION SCHEME.  THE LOOP IS EXECUTED TWICE.

-- THE TEST CONSISTS OF A LOOP STATEMENT WITH A LOOP PARAMETER SPECIFI-
-- CATION THAT INCLUDES A NON-STATIC DISCRETE RANGE.  THIS RANGE IS
-- INITIALIZED BY CAMOUFLAGED ASSIGNMENTS TO THE LOCAL VARIABLES,
-- M AND N, SO THAT THE LOOP IS EXECUTED TWICE, RESULTING TWO CONSECUTIV
-- CAMOUFLAGED ASSIGNMENTS TO THE GLOBAL VARIABLE.  ADDITIONAL CAMOUFLAG
-- ASSIGNMENTS ARE INCLUDED TO PREVENT THE LOCAL VARIABLES FROM BECOMING
-- CANDIDATES FOR ELIMINATION AS DEAD VARIABLES IN THE NOISE VERSION.
-- BECAUSE THE LOOP STATEMENT IS EXECUTED TWICE, A CONDITIONAL STATEMENT
-- IS ADDED SO THAT IN THE NOISE VERSION, WHEN THE LOOP STATEMENT IS
-- REMOVED, THE CODE EFFICIENCY METRICS ARE NOT COMPROMISED.  THIS
-- CONDITIONAL ALWAYS EVALUATES TO TRUE AND RESULTS IN BALANCING THE
-- NUMBER OF CAMOUFLAGED ASSIGNMENTS THAT EXIST AND ARE EXECUTED IN
-- THE TEST AND NOISE VERSIONS.

with Instrument;
use Instrument;
with Ics;
use Ics;

procedure Flp2a2 is
    N : Integer;
    M : Integer;
begin

    Start ("FLP2A2", " EFFICIENCY OF LOOP STMT USING FOR, 2 ITERATIONS, " &
                        "1000 REPETITIONS");

    for Lcv in 1 .. 1000 loop
        N := Ident (One);
        M := Ident (Zero);

        for I in N .. M loop
            -- EXECUTED TWICE
            Let (Global, Ident (One));
        end loop;

        -- SINCE THE LOOP BODY IS EXECUTED TWICE IN THE TEST VERSION, AND TH
        -- VERSION MUST CONTAIN THE SAME AMOUNT OF CODE BUT EXECUTE THE SAME
        -- STATEMENTS (OTHER THAN THE LOOP STATEMENT), A CONDITIONAL STATEME
        -- WHOSE TRUE PART DIFFERS IN THE NOISE VERSION IS USED.

        Let (Global, N);
        Let (Global, M);
        if Global /= Zero then
            -- ALWAYS TRUE
            Let (Global, Ident (One));
        else
            -- COMMENTED OUT IN NOISE VERSIO
            Let (Global, Ident (One));                -- EXECUTED IN NOISE VERSI
            --ELSE                                -- COMMENTED OUT IN TEST VERSION
            Let (Global, Ident (One));
        end if;

    end loop;

    Stop;

end Flp2a2;