with Instrument;
use Instrument;

------------------
-- LOCAL REFERENCE 01
------------------

-- THIS TEST EVALUATES THE CODE EFFICIENCY OF REFERENCING A COMPONENT OF
-- A LOCAL ARRAY VARIABLE, I.E., A REFERENCE TO AN ARRAY THAT IS
-- DECLARED IMMEDIATELY WITHIN THE DECLARATIVE REGION IN WHICH THE
-- COMPONENT IS REFERENCED.

-- THE TEST VERSION INCLUDES THE COMPONENT REFERENCE TO BE EVALUATED BY
-- ASSIGNING A COMPONENT OF A LOCAL ARRAY, LOCAL_01, TO THE GLOBAL
-- VARIABLE.  PRIOR TO THIS ASSIGNMENT, CAMOUFLAGED ASSIGNMENTS ARE
-- MADE TO BOTH THE LOCAL ARRAY AND THE GLOBAL VARIABLE. THE GLOBAL
-- VARIABLE IS USED IN A CONDITIONAL STATEMENT TO GUARD THE TEST
-- ASSIGNMENT FROM OPTIMIZATIONS.  BECAUSE OF THIS GUARD, THE LOCAL
-- ARRAY MUST BE UPDATED WITH ITS INITIAL VALUE SINCE THE CONDITIONAL
-- STATEMENT REQUIRES DYNAMIC EVALUATION.  ADDITIONAL CAMOUFLAGED
-- ASSIGNMENTS ARE MADE TO MAINTAIN THE VALIDITY OF THE CONDITIONAL
-- STATEMENT AND TO PREVENT ELIMINATION OF THE OTHERWISE UNREFERENCED
-- LOCAL ARRAY IN THE NOISE VERSION.


-- THE NOISE VERSION IS IDENTICAL TO THE TEST VERSION EXCEPT THAT THE
-- TEST REFERENCE TO THE COMPONENT OF THE LOCAL ARRAY IS REMOVED SO THAT
-- THE CODE EFFICIENCY METRICS FOR THE LOCAL REFERENCE CAN BE DERIVED AS
-- A PART OF ASSIGNMENT.

procedure Lavra1 is
    Arr_Size : constant := 1000;
    package Dr_Cs is new Arr_Procs (Integer, Arr_Size);
    use Dr_Cs;

    Local_01 : T (Init'Range);

    I : Index := Init'First;

begin
    Start ("LAVRA1", "1 Local Array Var. Ref. (control)");
    for I in 1 .. Arr_Size loop


        Let (Global, Ident (Init));
        Let (Local_01, Ident (Init));

        if Global (I) = Init (I) then
            --    GLOBAL(I) := LOCAL_01(I);   -- COMMENTED OUT IN NOISE VERSION
            Let (Local_01, Ident (Init));
        end if;

        Let (Global, Ident (Local_01));

    end loop;
    Stop;
end Lavra1;