0% found this document useful (0 votes)
62 views6 pages

Loop Optimizations and Pointer Analysis

The document discusses several loop optimization techniques including strength reduction of induction variables to replace expensive multiplications with cheaper additions, induction variable elimination to remove unnecessary induction variable definitions and rewrite loop tests, and finding induction variables through data flow analysis and representing them with triples to identify opportunities for these optimizations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
62 views6 pages

Loop Optimizations and Pointer Analysis

The document discusses several loop optimization techniques including strength reduction of induction variables to replace expensive multiplications with cheaper additions, induction variable elimination to remove unnecessary induction variable definitions and rewrite loop tests, and finding induction variables through data flow analysis and representing them with triples to identify opportunities for these optimizations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

Loop optimizations

• Optimize loops
– Loop invariant code motion [last time]
Loop Optimizations – Strength reduction of induction variables
and Pointer Analysis – Induction variable elimination

CS 412/413 Spring 2008 Introduction to Compilers 1 CS 412/413 Spring 2008 Introduction to Compilers 2

Strength Reduction Induction Variables


• Basic idea: replace expensive operations (multiplications) with • An induction variable is a variable in a loop,
cheaper ones (additions) in definitions of induction variables
whose value is a function of the loop iteration
s = 3*i+1; number v = f(i)
while (i<10) { while (i<10) {
j = 3*i+1; //<i,3,1> j = s;
• In compilers, this a linear function:
a[j] = a[j] –2; a[j] = a[j] –2;
i = i+2; i = i+2; f(i) = c*i + d
} s= s+6;
} • Observation: linear combinations of linear
• Benefit: cheaper to compute s = s+6 than j = 3*i functions are linear functions
– s = s+6 requires an addition – Consequence: linear combinations of induction
– j = 3*i requires a multiplication variables are induction variables

CS 412/413 Spring 2008 Introduction to Compilers 3 CS 412/413 Spring 2008 Introduction to Compilers 4

1
Families of Induction Variables Representation
• Basic induction variable: a variable whose only definition in the • Representation of induction variables in family i by triples:
loop body is of the form
– Denote basic induction variable i by <i, 1, 0>
i=i+c
– Denote induction variable k=i*a+b by triple <i, a, b>
where c is a loop-invariant value

• Derived induction variables: Each basic induction variable i defines


a family of induction variables Family(i)
– i  Family(i)
– k  Family(i) if there is only one definition of k in the loop body , and it
has the form k = c*j or k=j+c, where
(a) j  Family(i)
(b) c is loop invariant
(c) The only definition of j that reaches the definition of k is in the loop
(d) There is no definition of i between the definitions of j and k

CS 412/413 Spring 2008 Introduction to Compilers 5 CS 412/413 Spring 2008 Introduction to Compilers 6

Finding Induction Variables Strength Reduction


Scan loop body to find all basic induction variables • Basic idea: replace expensive operations (multiplications) with
cheaper ones (additions) in definitions of induction variables
do
Scan loop to find all variables k with one assignment of form k = s = 3*i+1;
j*b, where j is an induction variable <i,c,d>, and make k an while (i<10) { while (i<10) {
induction variable with triple <i,c*b,d> j = …; // <i,3,1> j = s;
a[j] = a[j] –2; a[j] = a[j] –2;
Scan loop to find all variables k with one assignment of form k =
jb where j is an induction variable with triple <i,c,d>, and
i = i+2; i = i+2;
make k an induction variable with triple <i,c,bd> } s= s+6;
}
until no more induction variables found
• Benefit: cheaper to compute s = s+6 than j = 3*i
– s = s+6 requires an addition
– j = 3*i requires a multiplication

CS 412/413 Spring 2008 Introduction to Compilers 7 CS 412/413 Spring 2008 Introduction to Compilers 8

2
General Algorithm Strength Reduction
• Algorithm: • Gives opportunities for copy propagation, dead code
elimination
For each induction variable j with triple <i,a,b>
whose definition involves multiplication: s = 3*i+1; s = 3*i+1;
1. create a new variable s while (i<10) { while (i<10) {
2. replace definition of j with j=s j = s;
3. immediately after i=i+c, insert s = s+a*c a[j] = a[j] –2; a[s] = a[s] –2;
(here a*c is constant) i = i+2; i = i+2;
s= s+6; s= s+6;
4. insert s = a*i+b into preheader
} }
• Correctness: transformation maintains invariant s = a*i+b

CS 412/413 Spring 2008 Introduction to Compilers 9 CS 412/413 Spring 2008 Introduction to Compilers 10

Induction Variable Elimination Induction Variable Elimination


• Idea: eliminate each basic induction variable whose only uses
are in loop test conditions and in their own definitions i = i+c • Rewrite test condition using derived induction variables
- rewrite loop test to eliminate induction variable • Remove definition of basic induction variables (if not used
after the loop)
s = 3*i+1;
while (i<10) {
a[s] = a[s] –2; s = 3*i+1; s = 3*i+1;
i = i+2; while (i<10) { while (s<31) {
s= s+6; a[s] = a[s] –2; a[s] = a[s] –2;
} i = i+2; s= s+6;
• When are induction variables used only in loop tests? s= s+6; }
– Usually, after strength reduction }
– Use algorithm from strength reduction even if definitions
of induction variables don’t involve multiplications

CS 412/413 Spring 2008 Introduction to Compilers 11 CS 412/413 Spring 2008 Introduction to Compilers 12

3
Induction Variable Elimination Where We Are
For each basic induction variable i whose only uses are • Defined dataflow analysis framework
– The test condition i < u
• Used it for several analyses
– The definition of i: i = i + c – Live variables
– Available expressions
• Take a derived induction variable k in family i, with – Reaching definitions
triple <i,c,d> – Constant folding
• Replace test condition i < u with k < c*u+d
• Remove definition i = i+c if i is not live on loop exit • Loop transformations
– Loop invariant code motion
– Induction variables

• Next:
– Pointer alias analysis

CS 412/413 Spring 2008 Introduction to Compilers 13 CS 412/413 Spring 2008 Introduction to Compilers 14

Pointer Alias Analysis Pointer Alias Analysis


• Most languages use variables containing addresses • Worst case scenarios
– E.g. pointers (C,C++), references (Java), call-by- – *p = y may write any memory location
reference parameters (Pascal, C++, Fortran) – x = *p may read any memory location
• Such assumptions may affect the precision of other analyses
• Pointer aliases: multiple names for the same memory
• Example1: Live variables
location, which occur when dereferencing variables that hold
memory addresses before any instruction x = *p, all the variables may be live

• Problem: • Example 2: Constant folding


a = 1; b = 2;*p = 0; c = a+b;
– Don’t know what variables read and written by accesses
via pointer aliases (e.g. *p=y; x=*p; p->f=y; x=p->f; • c = 3 at the end of code only if *p is not an alias for a or b!
etc.)
• Conclusion: precision of result for all other analyses depends
– Need to know accessed variables to compute dataflow on the amount of alias information available
information after each instruction - hence, it is a fundamental analysis
CS 412/413 Spring 2008 Introduction to Compilers 15 CS 412/413 Spring 2008 Introduction to Compilers 16

4
Alias Analysis Problem Simple Alias Analyses
• Address-taken analysis:
• Goal: for each variable v that may hold an address, – Consider AT = set of variables whose addresses are taken
compute the set Ptr(v) of possible targets of v – Then, Ptr(v) = AT, for each pointer variable v
– Ptr(v) is a set of variables (or objects) – Addresses of heap variables are always taken at allocation
– Ptr(v) includes stack- and heap-allocated variables (objects) sites (e.g., x = new int[2]; x=malloc(8); )
– Hence AT includes all heap variables
• Is a “may” analysis: if x  Ptr(v), then v may hold the
• Type-based alias analysis:
address of x in some execution of the program
– If v is a pointer (or reference) to type T, then Ptr(v) is the
set of all variables of type T
• No alias information: for each variable v, Ptr(v) = V, – Example: p->f and q->f can be aliases only if p and q are
where V is the set of all variables in the program references to objects of the same type
– Works only for strongly-typed languages

CS 412/413 Spring 2008 Introduction to Compilers 17 CS 412/413 Spring 2008 Introduction to Compilers 18

Dataflow Alias Analysis Dataflow Alias Analysis


• Dataflow analysis: for each variable v, compute points- • Dataflow Lattice: (2 V x V, ⊇ )
to set Ptr(v) at each program point – V x V represents “every variable may point to every var.”
– “may” analysis: top element is , meet operation is ⋃
• Dataflow information: set Ptr(v) for each variable v
• Transfer functions: use standard dataflow transfer functions:
– Can be represented as a graph G ⊆ 2 VxV
out[I] = (in[I]-kill[I]) U gen[I]
– Nodes = V (program variables)
p = addr q kill[I]={p} x V gen[I]={<p,q>}
– There is an edge vu if u  Ptr(v)
p=q kill[I]={p} x V gen[I]={p} x Ptr(q)
p = *q kill[I]={p} x V gen[I]={p} x Ptr(Ptr(q))
Ptr(x) = {y} z
x y *p = q kill[I]= … gen[I]=Ptr(p) x Ptr(q)
Ptr(y) = {z,t} For all other instruction, kill[I] = {}, gen[I] = {}
t
• Transfer functions are monotonic, but not distributive!

CS 412/413 Spring 2008 Introduction to Compilers 19 CS 412/413 Spring 2008 Introduction to Compilers 20

5
Alias Analysis Example Alias Analysis Uses
• Once alias information is available, use it in other
Program Points-to dataflow analyses
CFG
Graph
x=&a (at the end of program) • Example: Live variable analysis
x=&a; y=&b Use alias information to compute use[I] and def[I] for
y=&b; c=&i x a
load and store statements:
if(i) i
c=&i; y b
if(i) x=y; x = *y use[I] = {y} ⋃ Ptr(y) def[I]={x}
x=y
*x=c; c
*x = y use[I] = {x,y} def[I]=Ptr(x)
*x=c

CS 412/413 Spring 2008 Introduction to Compilers 21 CS 412/413 Spring 2008 Introduction to Compilers 22

You might also like