Copyright Digital Equipment Corp. All rights reserved.

IVDEP

 cDEC$ IVDEP

 The IVDEP directive assists the compiler's dependence analysis.  It
 can only be applied to iterative DO loops.  This directive can also
 be specified as INIT_DEP_FWD (INITialize DEPendences ForWarD).

 The IVDEP directive takes the following form:

 cDEC$ IVDEP

   c        Is one of the following: C (or c), !, or *.

 The IVDEP directive is an assertion to the compiler's optimizer
 about the order of memory references inside a DO loop.

 The IVDEP directive tells the compiler to begin dependence analysis
 by assuming all dependences occur in the same forward direction as
 their appearance in the normal scalar execution order.  This
 contrasts with normal compiler behavior, which is for the
 dependence analysis to make no initial assumptions about the
 direction of a dependence.

 The IVDEP directive must precede the DO statement for each DO loop
 it affects.  No source code lines, other than the following, can be
 placed between the IVDEP directive statement and the DO statement:

  o  An UNROLL directive

  o  Placeholder lines

  o  Comment lines

  o  Blank lines


 The IVDEP directive is applied to a DO loop in which the user knows
 that dependences are in lexical order.  For example, if two memory
 references in the loop touch the same memory location and one of
 them modifies the memory location, then the first reference to
 touch the location has to be the one that appears earlier lexically
 in the program source code.  This assumes that the right-hand side
 of an assignment statement is "earlier" than the left-hand side.

 The IVDEP directive informs the compiler that the program would
 behave correctly if the statements were executed in certain orders
 other than the sequential execution order, such as executing the
 first statement or block to completion for all iterations, then the
 next statement or block for all iterations, and so forth.  The
 optimizer can use this information, along with whatever else it can
 prove about the dependences, to choose other execution orders.

 Examples:

 In the following example, the IVDEP directive provides more
 information about the dependences within the loop, which may enable
 loop transformations to occur:

 !DEC$ IVDEP
       DO I=1, N
          A(INDARR(I)) = A(INDARR(I)) + B(I)
       END DO

 In this case, the scalar execution order follows:

 1.  Retrieve INDARR(I).

 2.  Use the result from step 1 to retrieve A(INDARR(I)).

 3.  Retrieve B(I).

 4.  Add the results from steps 2 and 3.

 5.  Store the results from step 4 into the location indicated by
     A(INDARR(I)) from step 1.


 IVDEP directs the compiler to initially assume that when steps 1
 and 5 access a common memory location, step 1 always accesses the
 location first because step 1 occurs earlier in the execution
 sequence.  This approach lets the compiler reorder instructions, as
 long as it chooses an instruction schedule that maintains the
 relative order of the array references.