The motivation for determining what variables and parameters appear to
be dependent or independent of each other is discussed in
Section . The goal of the new
integrate pass, run after the snoot and porky
passes, is to make this determination possible by gathering more
global-level information about what sets of quasistatic variables are
used together in the same qif statement, and what quasistatic
parameters interact with each other due to nested qinfluence
statements. Figures
shows a partial program;
Figure
demonstrate what information
integrate gathers by walking the abstract syntax trees looking for
qif and qinfluence statements; the gathered information is
stored in new annotations in the SUIF file. (Each different set is
also an assigned integer unique identifier stored in its annotation,
for later use.)
Specifically, a QIF SET annotation indicates that some part of the program has alternative code tagged by the given list of quasistatic variables. The indicator as to whether there is or is not a final qelse clause is important: if there is no final qelse in a given set, then that introduces the constraint that exactly one of the quasistatic variables must be selected to generate a valid version of the program; if there is a final qelse, then exactly zero or one of the variables must be selected. In this example, exactly one of the quasistatic variables ALTERNATIVE_1 or ALTERNATIVE_2 must be selected. It is possible to write source code such that it is impossible to generate a version of the program that satisfies all such constraints; a later clever compiler pass will complain in such a case.
A QINFLUENCE SET annotation indicates that there is some part of the program whose performance ought to be associated with the quasistatic parameters listed. Note that the qinfluence(THREADS) statement did not introduce a QINFLUENCE SET annotation listing just the THREADS parameter; instead, since the statement is lexically (textually) contained by a QINFLUENCE(BLOCK_SIZE) statement, a QINFLUENCE SET annotation listing both THREADS and BLOCK_SIZE was created instead.
Figure: integrate pass example input.
Figure: integrate pass finds qif chains and nested
qinfluence statements.
The integrate pass at the current time does not record explicit
information about other lexical nestings --- a qinfluence block
inside a qif statement clause, or a qif statement inside a
qinfluence block or another qif statement clause. Nor
does the current integrate attempt to derive information about
possible dynamic nesting --- cases where quasistatic variables and
parameters may interact to influence the performance of the program
through non-lexically-apparent interactions. For example, in
Figure , the performance of the program is
likely to depend on the interaction between the quasistatic variables
FOO and BAR and the quasistatic parameter QUX, but
the fact that FOO and BAR interact with QUX at
run-time is not readily apparent through lexical analysis.
Figure: Dynamic interactions between quasistatic variables and parameters.