Chapter 9
Machine-Independent Optimizations
High-level language constructs can introduce substantial run-time
overhead if we naively translate each construct independently into machine
code. This chapter discusses how to eliminate many of these inefficiencies.
Elimination of unnecessary instructions in object code, or the replacement of
one sequence of instructions by a faster sequence of instructions that does the
same thing is usually called "code improvement" or "code
optimization."
Local code optimization (code improvement within a basic block) was
intro-duced in Section 8.5. This chapter deals with global code optimization, where improvements take into account what
happens across basic blocks. We begin in Section 9.1 with a discussion of the
principal opportunities for code improve-ment.
Most global optimizations are based on data-flow analyses, which are algo-rithms to gather information
about a program. The results of data-flow analyses all have the same form: for
each instruction in the program, they specify some property that must hold
every time that instruction is executed. The analyses differ in the properties
they compute. For example, a constant-propagation analysis computes, for each
point in the program, and for each variable used by the program, whether that
variable has a unique constant value at that point. This information may be
used to replace variable references by constant values, for instance. As
another example, a liveness analysis determines, for each point in the program,
whether the value held by a particular variable at that point is sure to be
overwritten before it is read. If so, we do not need to preserve that value,
either in a register or in a memory location.
We introduce data-flow analysis in Section 9.2, including several
important examples of the kind of information we gather globally and then use
to improve the code. Section 9.3 introduces the general idea of a data-flow
framework, of which the data-flow analyses in Section 9.2 are special cases. We
can use essentially the same algorithms for all these instances of data-flow
analysis, and we can measure the performance of these algorithms and show their
correctness on all instances, as well. Section 9.4 is an example of the general
framework that does more powerful analysis than
the earlier examples. Then, in Section
9.5 we consider a powerful technique,
called "partial redundancy
elimination," for optimizing the
placement of each expression evaluation in the program. The solution to this
problem requires the solution of a variety of different data-flow problems.
In Section 9.6 we take up the discovery and analysis of loops in
programs.
The identification of loops
leads to another family of algorithms for solving data-flow problems that is
based on the hierarchical
structure of the loops of a well-formed ("reducible") program. This
approach to data-flow analysis is covered in Section 9.7. Finally, Section 9.8
uses hierarchical analysis to eliminate induction variables (essentially,
variables that count the number of iterations around a loop). This code
improvement is one of the most important we can make for programs written in
commonly used programming languages.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.