Dependence analysis for pointer variables

Our concern is how to determine data dependencies between program constructs in programming languages with pointer variables. We are particularly interested in computing data dependencies for languages that manipulate heap-allocated storage, such as Lisp and Pascal. We have defined a family of algorithms that compute safe approximations to the flow, output, and anti-dependencies of a program written in such a language. Our algorithms account for destructive updates to fields of a structure and thus are not limited to the cases where all structures are trees or acyclic graphs; they are applicable to programs that build cyclic structures. Our technique extends an analysis method described by Jones and Muchnick that determines an approximation to the actual layouts of memory that can arise at each program point during execution. We extend the domain used in their abstract interpretation so that the (abstract) memory locations are labeled by the program points that set their contents. Data dependencies are then determined from these memory layouts according to the component labels found along the access paths that must be traversed during execution to evaluate the program's statements and predicates. For structured programming constructs, the technique can be extended to distinguish between loop-carried and loop-independent dependencies, as well as to determine lower bounds on minimum distances for loop-carried dependencies.

[1]  Wuu Yang,et al.  The Semantics of Program Slicing , 1988 .

[2]  Patrick Cousot,et al.  Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints , 1977, POPL.

[3]  Alfred V. Aho,et al.  Compilers: Principles, Techniques, and Tools , 1986, Addison-Wesley series in computer science / World student series edition.

[4]  Thomas W. Reps,et al.  Integrating non-intering versions of programs , 1988, POPL '88.

[5]  James R. Larus,et al.  Restructuring Lisp programs for concurrent execution , 1988, PPEALS '88.

[6]  Thomas P. Murtagh,et al.  Lifetime analysis of dynamically allocated objects , 1988, POPL '88.

[7]  David A. Padua,et al.  Dependence graphs and compiler optimizations , 1981, POPL '81.

[8]  James R. Larus Curare: Restructuring Lisp Programs For Concurrent Execution , 1987 .

[9]  David Alejandro Padua Haiek Multiprocessors: discussion of some theoretical and practical problems , 1980 .

[10]  Anne Denise Neirynck Static analysis of aliases and side effects in higher-order languages , 1988 .

[11]  Vincent A. Guarna,et al.  A Technique for Analyzing Pointer and Structure References In Parallel Restructuring Compilers , 1988, ICPP.

[12]  David W. Binkley,et al.  Interprocedural slicing using dependence graphs , 1990, TOPL.

[13]  James R. Larus,et al.  Restructuring Lisp programs for concurrent execution , 1988, PPoPP 1988.

[14]  Jan Stransky Analyse sémantique de structures de données dynamiques avec application au cas particulier de langages LISPiens , 1988 .

[15]  John Randal Allen,et al.  Dependence analysis for subscripted variables and its application to program transformations , 1983 .

[16]  James R. Larus,et al.  Detecting conflicts between structure accesses , 1988, PLDI '88.

[17]  Ken Kennedy,et al.  Garbage collection and other optimizations , 1988 .

[18]  Karl J. Ottenstein,et al.  The program dependence graph in a software development environment , 1984, SDE 1.

[19]  Joe D. Warren,et al.  The program dependence graph and its use in optimization , 1987, TOPL.

[20]  Neil D. Jones,et al.  Flow analysis and optimization of LISP-like structures , 1979, POPL.