For a two-phase problem, the second phase of the algorithm derives the data-flow input to each procedure and its subregions. This phase of the analysis is performed top-down over the call graph and from outermost to innermost loops within each procedure body. For a procedure, the analysis derives the set of calling contexts contributed by calls to the procedure. Instead of performing a meet operation over all of the calling contexts, the analysis partitions these contexts into equivalence classes under the relation according to their data-flow information before meeting only the contexts within each equivalence class.
The number of partitions is reduced by first using a to eliminate from the data-flow values information not relevant to the called procedure. (We describe an example of this filtering in Section 4.)
Each partition defines a data-flow input value , the meet of the calling contexts in that partition. For each partition, the analysis applies the transfer functions to this data-flow value to propagate information from outermost to innermost to yield the input to inner regions. For a region R representing a procedure call, the analysis adds to the corresponding call graph edge the calling context . It is important to note that our analysis does not actually generate cloned procedure bodies, but merely replicates their data-flow information for the purposes of analysis.