Download presentation
Presentation is loading. Please wait.
Published byCarsten Wagner Modified over 6 years ago
1
Fall 2015-2016 Compiler Principles Lecture 10: Loop Optimizations
Roman Manevich Ben-Gurion University of the Negev
2
Tentative syllabus Front End Intermediate Representation Optimizations
Scanning Top-down Parsing (LL) Bottom-up Parsing (LR) Intermediate Representation Lowering Operational Semantics Lowering Correctness Optimizations Dataflow Analysis Loop Optimizations Code Generation Register Allocation
3
previously Dataflow analysis framework More optimizations
Join semilattices Chaotic iteration Monotone transformers More optimizations Reminder: Available expressions common sub-expression elimination + copy propagation Constant propagation constant folding
4
agenda Loop optimizations Dataflow summary
Reaching definitions loop code motion + strength reduction via induction variables Dataflow summary
5
Loop optimizations Most of a program’s computations are done inside loops Focus optimizations effort on loops The optimizations we’ve seen so far are independent of the control structure Some optimizations are specialized to loops Loop-invariant code motion (Strength reduction via induction variables) Require another type of analysis to find out where expressions get their values from Reaching definitions
6
Loop invariant computation
y = … t = … z = … start y = t * 4 x < y + z x = x + 1 end
7
Loop invariant computation
y = … t = … z = … start t*4 and y+z have same value on each iteration y = t * 4 x < y + z x = x + 1 end
8
Code hoisting y = … t = … z = … y = t * 4 w = y + z start x < w
x = x + 1 end
9
What reasoning did we use?
Both t and z are defined only outside of loop y = … t = … z = … start constants are trivially loop-invariant y = t * 4 x < y + z y is defined inside loop but it is loop invariant since t*4 is loop-invariant x = x + 1 end
10
What about now? y = … t = … z = … start
Now t is not loop-invariant and so are t*4 and y y = t * 4 x < y + z x = x + 1 t = t + 1 end
11
Loop-invariant code motion
d: t = a1 op a2 d is a program location a1 op a2 loop-invariant (for a loop L) if computes the same value in each iteration Hard to know in general Conservative approximation Each ai is a constant, or All definitions of ai that reach d are outside L, or Only one definition of of ai reaches d, and is loop-invariant itself Transformation: hoist the loop-invariant code outside of the loop
12
Reaching definitions analysis
13
Reaching definitions analysis
A definition d: t = … reaches a program location if there is a path from the definition to the program location, along which the defined variable is never redefined Let’s define the corresponding dataflow analysis…
14
Reaching definitions analysis
A definition d: t = … reaches a program location if there is a path from the definition to the program location, along which the defined variable is never redefined Direction: ? Domain: ? Join operator: ? Transfer function: fd: a=b op c(RD) = ? fd: not-a-def(RD) = ? Where defs(a) is the set of locations defining a (statements of the form a=...) Initial value: ?
15
Reaching definitions analysis
A definition d: t := … reaches a program location if there is a path from the definition to the program location, along which the defined variable is never redefined Direction: Forward Domain: sets of program locations that are definitions Join operator: union Transfer function: F[d: x:=R](RD) = (RD \ defs(x)) {d} F[d: not-a-def](RD) = RD Where defs(x) is the set of locations defining x (statements of the form x:=R) Initial value: {}
16
Reaching definitions analysis
d1: y = … d2: t = … d3: z = … start d4: y = t * 4 d4:x < y + z end {} d6: x = x + 1
17
Reaching definitions analysis
d1: y = … d2: t = … d3: z = … start d4: y = t * 4 d4:x < y + z end {} d5: x = x + 1
18
Initialization d1: y = … d2: t = … d3: z = … start {} {}
d4: y = t * 4 d4:x < y + z end {} {} d5: x = x + 1 {}
19
Iteration 1 d1: y = … d2: t = … d3: z = … {} start {} {}
d4: y = t * 4 d4:x < y + z end {} {} d5: x = x + 1 {}
20
Iteration 1 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} d4: y = t * 4 d4:x < y + z end {} {} d5: x = x + 1 {}
21
Iteration 2 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} d4: y = t * x < y + z end {} {} d5: x = x + 1 {}
22
Iteration 2 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {} d5: x = x + 1 {}
23
Iteration 2 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {d2, d3, d4} {} d5: x = x + 1 {}
24
Iteration 2 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {d2, d3, d4} {d2, d3, d4} d5: x = x + 1 {}
25
Iteration 3 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {d2, d3, d4} {d2, d3, d4} d5: x = x + 1 {d2, d3, d4} {}
26
Iteration 3 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {d2, d3, d4} {d2, d3, d4} d5: x = x + 1 {d2, d3, d4} {d2, d3, d4, d5}
27
Iteration 4 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3} d4: y = t * x < y + z end {} {d2, d3, d4} {d2, d3, d4} d5: x = x + 1 {d2, d3, d4} {d2, d3, d4, d5}
28
Iteration 4 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3, d4, d5} d4: y = t * x < y + z end {} {d2, d3, d4} {d2, d3, d4} d5: x = x + 1 {d2, d3, d4} {d2, d3, d4, d5}
29
Iteration 4 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3, d4, d5} d4: y = t * x < y + z end {} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4} {d2, d3, d4, d5}
30
Iteration 5 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4, d5} end {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4} {d2, d3, d4, d5}
31
Iteration 6 d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2}
{d1, d2, d3} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4, d5} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
32
Which expressions are loop invariant
d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2} t is defined only in d2 – outside of loop {d1, d2, d3} y is defined only in d4 – inside of loop but depends on t and 4, both loop-invariant {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4, d5} end {d2, d3, d4, d5} x is defined only in d5 – inside of loop so is not a loop-invariant {d2, d3, d4, d5} z is defined only in d3 – outside of loop {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
33
Inferring loop invariants
34
Inferring loop-invariant expressions
For a command c of the form t := a1 op a2 A variable ai is immediately loop-invariant if all reaching definitions IN[c]={d1,…,dk} for ai are outside of the loop LOOP-INV = immediately loop-invariant variables and constants LOOP-INV = LOOP-INV {x | d: x := a1 op a2, d is in the loop, and both a1 and a2 are in LOOP-INV} Iterate until fixed-point An expression is loop-invariant if all operands are loop-invariants
35
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {}
{d1, d2} {d1, d2, d3} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
36
(immediately) LOOP-INV = {t}
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2} {d1, d2, d3} (immediately) LOOP-INV = {t} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
37
(immediately) LOOP-INV = {t, z}
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2} {d1, d2, d3} (immediately) LOOP-INV = {t, z} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
38
(immediately) LOOP-INV = {t, z}
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2} {d1, d2, d3} (immediately) LOOP-INV = {t, z} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
39
(immediately) LOOP-INV = {t, z}
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {} {d1, d2} {d1, d2, d3} (immediately) LOOP-INV = {t, z} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
40
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {}
{d1, d2} {d1, d2, d3} LOOP-INV = {t, z, 4} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
41
Computing LOOP-INV d1: y = … d2: t = … d3: z = … {} {d1} start {}
{d1, d2} {d1, d2, d3} LOOP-INV = {t, z, 4, y} {d1, d2, d3, d4, d5} d4: y = t * x < y + z {d2, d3, d4} end {d2, d3, d4, d5} {d2, d3, d4, d5} {d2, d3, d4, d5} d5: x = x + 1 {d2, d3, d4, d5}
42
Strength reduction via induction variables
43
Induction variables j is a linear function of the induction variable with multiplier 4 while (i < x) { j = a + 4 * i a[j] = j i = i + 1 } i is incremented by a loop-invariant expression on each iteration – this is called an induction variable
44
Strength-reduction Prepare initial value
j = a + 4 * (i-1) while (i < x) { j = j a[j] = j i = i + 1 } Increment by multiplier
45
Dataflow summary
46
Summary of optimizations
All of the analyses below use monotone transformers Enabled Optimizations Analysis Common-subexpression elimination Copy Propagation Available Expressions Constant folding Constant Propagation Dead code elimination Live Variables Strongly-live variables Loop-invariant code motion Induction variable strength reduction Reaching Definitions
47
Analysis direction Forward Backward
In the CFG, information is propagated from predecessors of a statement to its output Properties depend on past computations Examples: available expressions, constant propagating, reaching definitions Backward In the CFG, information is propagated from successors of a statement to its output Properties depend on future computations Examples: Liveness analysis
48
Types of dataflow analysis
May vs. Must Must analysis – properties hold on all paths (join is set intersection) Examples: available expressions, constant propagation May analysis – properties hold on some path (join is set union) Examples: liveness, reaching definitions
49
Next lecture: Register allocation
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.