Chapter 12
Interprocedural Analysis
In this chapter, we
motivate the importance of interprocedural analysis by dis-cussing a number of
important optimization problems that cannot be solved with intraprocedural
analysis. We begin by describing the common forms of interprocedural analysis
and explaining the difficulties in their implementation. We then describe
applications for interprocedural analysis. For widely used programming
languages like C and Java, pointer alias analysis is key to any interprocedural
analysis. Thus, for much of the chapter, we discuss techniques needed to
compute pointer aliases. To start, we present Datalog, a notation that greatly
hides the complexity of an efficient pointer analysis. We then de-scribe an
algorithm for pointer analysis, and show how we use the abstraction of binary
decision diagrams (BDD's) to implement the algorithm efficiently.
Most compiler
optimizations, including those described in Chapters 9, 10, and 11, are performed
on procedures one at a time. We refer to such analyses as intraprocedural. These
analyses conservatively assume that procedures invoked may alter the
state of all the variables visible to the procedures and that they may create
all possible side effects, such as modifying any of the variables visible to
the procedure or generating exceptions that cause the unwinding of the call
stack. Intraprocedural analysis is thus relatively simple, albeit imprecise.
Some optimizations do not need interprocedural analysis, while others may yield
almost no useful information without it.
An interprocedural
analysis operates across an entire program, flowing in-formation from the
caller to its callees and vice versa. One relatively simple but useful
technique is to inline procedures, that is, to replace a procedure
invoca-tion by the body of the procedure itself with suitable modifications to
account for parameter passing and the return value. This method is applicable
only if we know the target of the procedure call.
If procedures are
invoked indirectly through a pointer or via the method-dispatch mechanism
prevalent in object-oriented programming, analysis of the program's pointers or
references can in some cases determine the targets of the indirect invocations.
If there is a unique target, inlining can be applied.
Even if a unique
target is determined for each procedure invocation, inlining must be applied
judiciously. In general, it is not possible to inline recursive procedures
directly, and even without recursion, inlining can expand the code size
exponentially.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.