Presentation is loading. Please wait.

Presentation is loading. Please wait.

Fall Compiler Principles Lecture 10: Loop Optimizations

Similar presentations


Presentation on theme: "Fall Compiler Principles Lecture 10: Loop Optimizations"— Presentation transcript:

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


Download ppt "Fall Compiler Principles Lecture 10: Loop Optimizations"

Similar presentations


Ads by Google