Data-Flow Analysis · Data-Flow Analysis • Data-Flow Analysis . CSCI 565 - Compiler Design Spring...

Preview:

Citation preview

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu

Data-Flow Analysis

Copyright 2011, Pedro C. Diniz, all rights reserved. Students enrolled in the Compilers class at the University of Southern California have explicit permission to make copies of these materials for their personal use.

Overview Available Expressions Problem and

Iterative Data-Flow Formulation

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 2

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 3

Control Flow of a Program

•  Forms a Graph

•  A Very Large Graph •  Create Basic Blocks •  A Control-Flow Graph (CFG) connects basic blocks

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 4

Control Flow Graph (CFG) •  Control-Flow Graph G = <N, E> •  Nodes(N): Basic Blocks •  Edges(E): (x,y) ∈ E iff first instruction in the basic

block y follows the last instruction in the basic block x

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 5

Identifying Recursive Structures Loops

•  Identify back edges •  Find the nodes and edges in the loop

given by the back edge •  Other than the back edge

–  Incoming edges only to the basic block with the back edge head

–  one outgoing edge from the basic block with the tail of the back edge

•  How do I find the back edges?

bb1

bb2

bb4 bb3

bb5

bb6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 6

Computing Dominators •  Algorithm

–  Make dominator set of the entry node as itself –  Make dominator set of the remainder nodes include all the nodes –  Visit the nodes in any order –  Make dominator set of the current node as the intersection of the

dominator sets of the predecessor nodes and the current node –  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 7

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

nodes to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 8

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

nodes to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

bb1 bb2 bb3 bb4 bb5 bb6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 9

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

nodes to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 10

Computing Dominators

bb1

bb2

bb4 bb3

bb5

bb6

{bb1}

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 11

Computing Dominators

bb1

bb2

bb4 bb3

bb5

bb6

{bb1}

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 12

Computing Dominators

bb1

bb2

bb4 bb3

bb5

bb6

{bb1}

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 13

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2

bb1 bb2 bb3 bb4 bb5 bb6

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 14

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 15

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb4 bb5 bb6

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 16

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 17

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 18

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 19

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb4 bb5 bb6

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 20

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 21

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 22

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 23

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 24

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 25

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb3 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 26

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 27

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb3 bb5 bb6

bb1 bb2 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 28

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 29

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 30

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

•  Algorithm –  Make dominator set of the entry node

as itself –  Make dominator set of the remainder

node to include all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node as the intersection of the dominator sets of the predecessor nodes and the current node

–  Repeat until no change

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 31

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 32

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 33

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 34

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 35

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 36

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 37

Computing Dominators

bb2

bb4 bb3

bb5

bb6

{bb1} bb1

•  Algorithm –  Make dominator set of the entry node

has itself –  Make dominator set of the rest have

all the nodes –  Visit the nodes in any order –  Make dominator set of the current

node intersection of the dominator sets of the predecessor nodes + the current node

–  Repeat until no change bb1 bb2 bb4

bb1 bb2 bb3

bb1 bb2

bb1 bb2 bb5 bb6

bb1 bb2 bb5

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 38

Computing Dominators •  What we just witness was an Iterative

Data-Flow Analysis Algorithm in Action –  Initialize all the nodes to a given value –  Visit nodes in some order –  Calculate the node’s value –  Repeat until no value changes (fixed-point computation)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 39

Data-Flow Analysis •  Local Analysis

–  Analyze the effect of each instruction in each Basic Block –  Compose effects of instructions to derive information from beginning

of basic block to each instruction

•  Data-Flow Analysis –  Iteratively propagate basic block information over the control-flow

graph until no changes –  Calculate the final value at the beginning of the basic block

•  Local Propagation –  propagate the information from the beginning of the basic block to

each instruction

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 40

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 41

Example: Available Expression •  An Expression is Available if and only if

–  All paths of execution reaching the current point passes through the point where the expression was defined

–  No variable used in the expression was modified between the definition point and the current point

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 42

Example: Available Expression

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 43

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

YES!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 44

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

YES!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 45

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

NO!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 46

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

NO!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 47

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

NO!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 48

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

YES!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 49

Is the Expression Available?

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

YES!

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 50

Use of Available Expressions

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 51

Use of Available Expressions

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 52

Use of Available Expressions

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 53

Use of Available Expressions

a = b + c d = e + f f = a + c

g = f

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 54

Use of Available Expressions

a = b + c d = e + f f = a + c

g = f

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 55

Use of Available Expressions

a = b + c d = e + f f = a + c

g = f

j = a + c + b + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 56

Use of Available Expressions

a = b + c d = e + f f = a + c

g = f

j = f + b + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 57

Use of Available Expressions

a = b + c d = e + f f = a + c

g = f

j = f + b + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 58

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 59

Algorithm for Available Expression •  Assign a Number to each Expression

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 60

Example: Available Expression

a = b + c d = e + f f = a + c

g = a + c

j = a + b + c + d

b = a + d h = c + f

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 61

Example: Available Expression

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 62

Gen and Kill Sets •  Gen Set

–  If a basic block (or instruction) defines the expression then the expression number is in the Gen Set for that basic block (or instruction)

•  Kill Set –  If a basic block (or instruction) redefines a variable in the expression

then that expression number is in the kill set for that basic block (or instruction)

–  Expression is thus not valid after that basic block (or instruction)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 63

Algorithm for Available Expression •  Assign a Number to each Expression •  Calculate Gen and Kill set for each instruction

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 64

Gen and Kill Sets a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 65

Gen and Kill Sets

a = b + c 1

d = e + f 2

f = a + c 3

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 66

Gen and Kill Sets

a = b + c 1 gen = { b + c } kill = { any expr with a }

d = e + f 2 gen = { e + f } kill = { any expr with d }

f = a + c 3 gen = { a + c } kill = { any expr with f }

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 67

Gen and Kill Sets

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 68

Algorithm for Available Expression •  Assign a Number to each Expression •  Calculate Gen and Kill sets for each instruction •  Calculate Aggregate Gen and Kill sets for each basic

block

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 69

Aggregate Gen and Kill Sets

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

•  Propagate all the Gen and Kill sets from top of the basic block to the bottom of the basic block

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 70

Aggregate Gen Set

OutGEN =

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InGEN set

OutGEN set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 71

Aggregate Gen Set •  The Gen set in the current

expression should be in the OutGEN Set

OutGEN = gen

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InGEN set

OutGEN set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 72

Aggregate Gen Set •  The Gen set in the current

expression should be in the OutGEN Set

•  Any expression in the InGEN Set that is not killed should be in the OutGEN Set

OutGEN = gen ∪ (InGEN - kill)

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InGEN set

OutGEN set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 73

Aggregate Gen Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 74

Aggregate Gen Set

OutGEN = gen ∪ (InGEN - kill)

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 75

Aggregate Gen Set

OutGEN = { 1 } ∪ ({ } - { 3,4,5,7})

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 76

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 77

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = gen ∪ (InGEN - kill)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 78

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 2 } ∪ ({ 1 } - { 5,7 })

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 79

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 80

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 } InGEN = { 1, 2 }

OutGEN = gen ∪ (InGEN - kill)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 81

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 } InGEN = { 1, 2 }

OutGEN = { 3 } ∪ ({1, 2} - {2, 6})

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 82

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 } InGEN = { 1, 2 }

OutGEN = { 1, 3 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 83

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 } InGEN = { 1, 2 }

OutGEN = { 1, 3 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 84

Aggregate Gen Set

OutGEN = { 1 }

InGEN = { }

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

InGEN = { 1 }

OutGEN = { 1, 2 } InGEN = { 1, 2 }

OutGEN = { 1, 3 }

GE

N =

{ 1,

3 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 85

Aggregate Kill Set

OutKILL =

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InKILL set

OutKILL set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 86

Aggregate Kill Set •  The kill set in the current

expression should be in the OutKILL set

OutKILL = kill

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InKILL set

OutKILL set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 87

Aggregate Kill Set •  The kill set in the current

expression should be in the OutKILL set

•  Any set in the InKILL should be in OutKILL

OutKILL = kill ∪ InKILL

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

InKILL set

OutKILL set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 88

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 89

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = kill ∪ InKILL

InKILL = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 90

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 } ∪ { }

InKILL = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 91

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 92

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = kill ∪ InKILL

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 93

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = { 5, 7 } ∪ { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 94

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 95

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

OutKILL = kill ∪ InKILL

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 96

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

OutKILL = { 2, 6 } ∪ { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 97

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

OutKILL = { 3, 4, 5, 7 }

InKILL = { }

OutKILL = { 3, 4, 5, 7 }

InKILL = { 3, 4, 5, 7 }

OutKILL = { 2, 3, 4, 5, 6, 7 }

InKILL = { 3, 4, 5, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 98

Aggregate Kill Set

a = b + c 1

gen = { 1 } kill = { 3, 4, 5, 7 }

d = e + f 2 gen = { 2 } kill = { 5, 7 }

f = a + c 3 gen = { 3 } kill = { 2, 6 }

KIL

L =

{ 2, 3

, 4, 5

, 6, 7

}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 99

Aggregate Gen and Kill Sets a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 100

Algorithm for Available Expression •  Assign a Number to each Expression •  Calculate Gen and Kill Sets for each instruction •  Calculate Aggregate Gen and Kill Sets for each basic

block •  Initialize available set at each basic block to be the

entire set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 101

Aggregate Gen and Kill Sets IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 102

Algorithm for Available Expression •  Assign a Number to each Expression •  Calculate Gen and Kill sets for each instruction •  Calculate Aggregate Gen and Kill sets for each basic

block •  Initialize available set at each basic block to be the

entire set •  Iteratively propagate available expression set over the

CFG

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 103

Propagate Available Expression Set

OUT =

gen = { … } kill = { ... }

IN set

OUT set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 104

•  If the expression is generated (in the gen set) then it is available at the end –  should in the OUT set

OUT = gen

gen = { … } kill = { ... }

IN set

OUT set

Propagate Available Expression Set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 105

•  If the expression is generated (in the gen set) then it is available at the end –  should in the OUT set

•  Any expression available at the input (in the IN set) and not killed should be available at the end

OUT = gen ∪ (IN - kill)

gen = { … } kill = { ... }

IN set

OUT set

Propagate Available Expression Set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 106

OUT = gen ∪ (IN - kill)

IN set

IN =

Propagate Available Expression Set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 107

•  Expression is available only if it is available in All Input Paths

OUT = gen ∪ (IN - kill) IN = ∩ OUT

Propagate Available Expression Set

IN set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 108

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 109

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1,2,3,4,5,6,7}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 110

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 111

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 112

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1, 3}

OUT = {1,2,3,4,5,6,7}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 113

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 114

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1,2,3,4,5,6,7}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 115

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 116

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 117

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1,2,3,4,5,6,7}

OUT = {1,2,3,4,5,6,7}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 118

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {1,2,3,4,5,6,7}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 119

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 120

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 121

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 122

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 123

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = {1, 3, 4}

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 124

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {1, 3, 4, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 125

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 126

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = {1, 3}

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 127

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 128

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 129

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 130

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 131

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 132

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 133

Aggregate Gen and Kill Sets

OUT = gen ∪ (IN - kill)

IN = ∩ OUT IN = { }

OUT = {1, 3}

a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1, 3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5, 6 } Kill = { 1, 7 }

Gen = { 7 } Kill = { }

IN = { 3 }

OUT = {3, 5, 6}

OUT = {3, 7}

IN = { 3 }

IN = {1, 3}

OUT = {1, 3, 4}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 134

Algorithm for Available Expression •  Assign a Number to each Expression •  Calculate Gen and Kill Sets for each Instruction •  Calculate aggregate Gen and Kill Sets for each basic

block •  Initialize Available Set at each basic block to be the

entire set •  Iteratively propagate available expression set over the

CFG •  Propagate within the basic block

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 135

Propagate within the Basic Block •  Start with the IN set of available

expressions •  Linearly propagate down the

basic block –  same as data-flow step –  single pass since no back edges

OUT = gen ∪ (IN - kill)

a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 }

IN set

OUT set

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 136

Available Expressions

ae = { } a = b + c 1 ae = { 1 } d = e + f 2 ae = { 1, 2 } f = a + c 3 ae = { 1, 3 }

ae = { 1, 3 } g = a + c 4 ae = { 1, 3, 4 }

ae = { 3 } j = a + b + c + d 7 ae = { 3, 7 }

ae = { 3 } b = a + d 5 ae = { 3, 5 } h = c + f 6 ae = { 3, 5, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 137

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 138

Practical Issues: Bit Sets •  Assign a bit to each element of the set

–  Union ⇒ bit OR –  Intersection ⇒ bit AND –  Subtraction ⇒ bit NEGATE and AND

•  Fast implementation –  32 elements packed to each word –  AND and OR are single instructions

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 139

Kill Set vs. Preserve Set •  Kill Sets

– OUT = gen ∪ (IN - kill) – Using bit vectors: OUT = gen ∨ (IN - kill) –  Subtraction ⇒ bit NEGATE and AND

– OUT = gen ∨ (IN ∧ ¬ kill)

•  Preserve Sets –  Used in other formulations of the Problem –  PRSV = Entire Set - KILL

– OUT = gen ∪ (IN ∩ prsv) – OUT = gen ∨ (IN ∧ prsv)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 140

Aggregate Gen and Kill Sets a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1,3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5,6 } Kill = { 1,7 }

Gen = { 7 } Kill = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 141

Aggregate Gen and Kill Sets a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

Gen = { 1,3} Kill = { 2,3,4,5,6,7 }

Gen = { 4 } Kill = { }

Gen = { 5,6 } Kill = { 1,7 }

Gen = { 7 } Kill = { }

7 bits per set required

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 142

Aggregate Gen and Kill Sets a = b + c 1 d = e + f 2 f = a + c 3

g = a + c 4

j = a + b + c + d 7

b = a + d 5 h = c + f 6

7 bits per set required Gen = 1010000 Kill = 0111111

Gen = 0001000 Kill = 0000000

Gen = 0000110 Kill = 1000001

Gen = 0000001 Kill = 0000000

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 143

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 144

Formulating an Iterative Data-Flow Analysis Problem

•  Problem Independent –  Calculate Gen and Kill Sets for each Basic Block –  Iterative Propagation of Information until Convergence –  Propagation of Information within the Basic Block

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 145

Formulating an Iterative Data-Flow Analysis Problem

•  Lattice –  Abstract quantities over which the analysis will operate

example: sets of available expressions

•  Flow Functions –  How each control-flow and computational construct affects the

abstract quantities Example: the OUT equation for each statement

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 146

Lattice •  A Lattice L consists of

–  A Set of Values

–  Two operations meet( ∧ ) and join ( ∨ )

–  A top value (T) and a bottom value (⊥)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 147

Lattice •  Example: the Lattice for the Reaching Definition

Problem when there are only 3 definitions

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 148

Meet and Join Operations •  Meet and Join forms a closure

–  For all a, b ∈ L there exist a unique c and d ∈ L such that a ∧ b = c a ∨ b = d

•  Meet and Join are commutative –  a ∧ b = b ∧ a a ∨ b = b ∨ a

•  Meet and Join are associative –  (a ∧ b) ∧ c = b ∧ (a ∧ c) (a ∨ b) ∨ c = b ∨ (a ∨ c)

•  There exist a unique top element (T) and bottom element (⊥) in L such that –  a ∧ ⊥ = ⊥ a ∨ T = T

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 149

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∧ { d2, d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 150

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∧ { d2, d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 151

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∧ { d2, d3 } = { d2 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 152

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∨ { d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 153

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∨ { d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 154

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∨ { d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 155

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∨ { d3 } = ???

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 156

Meet and Join Operations

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

{ d1, d2 } ∨ { d3 } = { d1, d2, d3}

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 157

Meet and Join Operations

•  Meet Operation: Greatest Lower Bound - GLB({x,y}) –  Typically Set Intersection –  Follow the lines downwards from the two elements in the lattice until

they meet at a single unique element

•  Join Operation: Lowest Upper Bound - LUB({x,y}) –  Typically Set Union –  There is a unique element in the lattice from where there is a

downwards path (with no shared segment) to both elements

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 158

Partial Order •  Define a ⊆ b if and only if a ∧ b = b •  Properties

–  Reflexive: a ⊆ a –  Antisymmetric: a ⊆ b and b ⊆ a ⇒ a = b –  Transitive: a ⊆ b and b ⊆ c ⇒ a ⊆ c

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 159

Partial Order •  Define a ⊆ b if and only if a ∧ b = b •  Properties

–  a ⊆ b ⇒ there exit a path from b to a

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 160

Lattice Height •  The height of the lattice is the longest ascending

chain in it –  (T, a, b, c, …, ⊥)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 161

Lattice Height •  The height of the lattice is the longest ascending

chain in it –  (T, a, b, c, …, ⊥)

–  Height is (T, {d2,d3}, {d3}, ⊥) = 4

{ d1, d2 }

{ d2, d3 }

{ d1 }

{ d3 }

⊥ = { }

T = { d1, d2, d3 }

{ d1, d3 } { d2 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 162

Flow Functions •  Example: OUT = f(IN) •  f: L → L where L is a lattice •  Properties

–  Monotone: ∀a,b ∈ L a ⊆ b ⇒ f(a) ⊆ f(b)

•  Fixed Point –  A fixed point is an element a ∈L such that f(a) = a

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 163

Intuition about Termination •  Data-flow analysis starts assuming most optimistic

values (T) •  Each stage applies a flow function

–  Vnew ⊆ Vprev –  Moves downwards in the lattice

•  Until stable (values don’t change) –  A fixed point is reached at every basic block

•  Lattice has a finite height ⇒ should terminate

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 164

Dataflow Analysis Framework

•  A dataflow analysis framework consists of: –  A lattice (L, ⊆, ∩, ⊥) where:

•  L is the dataflow information •  ⊆ is the ordering relation •  ∩ is the merge operation (GLB)

•  ⊥ is the bottom element

–  Transfer functions Fn : L → L for each CFG node n

–  Boundary dataflow information d0 •  Before CFG entry node for a forward analysis •  After CFG exit node for a backward analysis

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 165

Dataflow Equations

•  Forward Data-Flow Analysis:

in[n0] = d0, where n0 = CFG entry node out[n] = Fn (in[n]), for all n in[n] = ∩ {out[n’] | n’∈ pred(n)}, for all n

•  Backward Data-Flow Analysis:

out[n0] = d0, where n0 = CFG exit node in[n] = Fn (out[n]), for all n out[n] = ∩ {in[n’] | n’∈ succ(n)}, for all n

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 166

Solving the Data-Flow Equations •  The Constraints (Forward Analysis):

in[n0] = d0, where n0 = CFG entry node out[n] = Fn (in[n]), for all n in[n] = ∩ {out[n’] | n’∈ pred(n)}, for all n

•  Solution = the set of all in[n], out[n] for all n’s, such that all Constraints are satisfied

•  Fixed-Point Algorithm to Solve Constraints: –  Initialize in[n0]=d0

–  Initialize everything else to ⊥ –  Repeatedly enforce Constraints –  Stop when Dataflow Solution

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 167

Worklist Algorithm (Forward) in[n0] = d0

in[n] = ⊥, for all n ≠ n0

out[n] = ⊥, for all n

worklist = {n0}

while ( worklist ≠ ∅ ) Remove a node n from the worklist out[n] = Fn(in[n])

for each successor n’ : in[n’] = in[n’] ∩ out[n] - distributivity at work if (in[n’] has changed) add n’ to the worklist

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 168

An Implementation void analyzeForward(Method m, DataflowInfo d0) { result.put(m.getCFG().getEntryNode(), d0); Stack<CFGNode> worklist = new Stack<CFGNode>(); while (!worlist.isEmpty()) { CFGNode n = worklist.pop(); DataflowInfo in = result.get(n); DataflowInfo out = transferFunction(n,in); for (CFGNode succ : n.getSuccessors()) if (merge(succ, out))

worklist.add(succ); } }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 169

An Implementation boolean merge(CFGNode n, DataflowInfo d) { DataflowInfo info = result.get(n); if (info == null) { result.put(n, d.clone()); return true; } return info.meet(d); }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 170

Correctness •  Correctness of the worklist algorithm:

–  At the end, all dataflow equations are satisfied

•  Argument: –  Loop maintains the invariant that the constraints

in[n] = ∩ {out[n’] | n’∈ pred(n)} out[n] = Fn(in[n])

hold for all the nodes n not in the worklist –  At the end, worklist is empty

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 171

Transfer Functions •  Transfer functions are required to be monotonic:

F : L → L is monotonic if x ⊆ y implies F(x) ⊆ F(y)

•  Distributivity: function F : L → L is distributive if F(x ∩ y) = F(x) ∩ F(y)

•  Property: F is monotonic iff F(x ∩ y) ⊆ F(x) ∩ F(y) - any distributive function is monotonic

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 172

Termination •  Do these Algorithms Terminate?

•  Observation: at each iteration, information increases in the lattice ink+1[n] ⊆ ink[n] and outk+1[n] ⊆ outk[n]

•  Proof by Induction: –  Induction basis: true, because we start with bottom element, which is less

than everything –  Induction step: use monotonicity of transfer functions and join operation

•  Information forms a chain: in1[n] ⊆ in2[n] ⊆ in3[n] …

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 173

Chains in Lattices •  A chain in a lattice L is a totally ordered subset S of L:

x ⊆ y or y ⊆ x for any x, y ∈ S

•  In other words: Elements in a totally ordered subset S can be indexed to form an descending sequence:

x1 ⊆ x2 ⊆ x3 ⊆ …

•  Height of a lattice = size of its largest chain •  Lattice with finite height: only has finite chains

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 174

Termination •  In the iterative algorithm, for each node n:

{in1[n], in2[n], …} is a chain in the lattice

•  If lattice has finite height then there is a number k such that ini[n] = ini+1[n], for all i ≥ k and all n

•  If ini[n] = ini+1[n] then also outi[n] = outi+1[n] •  Algorithm terminates in at most k*N iterations, where N is the number of

CFG nodes

•  To summarize: dataflow analysis terminates if 1. Transfer functions are monotonic 2. Lattice has finite height

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 175

•  The iterative algorithm computes a solution of the system of dataflow equations

•  … is the solution unique?

•  No, dataflow equations may have multiple solutions !

•  Example: Live Variables Equations: I1 = I2-{y} I3 = (I4-{x}) ∨ {y} I2 = I1 ∨ I3 I4 = {x}

Solution 1: I1={ }, I2={y}, I3={y}, I4={x} Solution 2: I1={x}, I2={x,y}, I3={y}, I4={x}

Multiple Solutions

x = y

y = 1 I1

I2

I3

I4

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 176

Safety and Precision •  Safety: any solution that satisfies the dataflow equations is safe •  Precision: a solution to an analysis problem is more precise if

it less conservative

•  Live Variables Analysis Problem: –  Solution is more precise if the sets of live variables are smaller –  Solution which reports that all variables are live at each point is safe,

but is too imprecise

•  In the lattice framework: d1 is more precise than d2 if d1 is higher in the lattice than d2: d2 ⊆ d1

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 177

Maximal Fixed Point Solution (MFP) •  Claim:

Among all the solutions to the system of dataflow equations, the iterative solution is the most precise

•  Intuition: –  We start with the top element at each program point (i.e. most precise

information) –  Then refine the information at each iteration to satisfy the dataflow

equations –  Final result will be the closest to the top

•  Iterative solution for dataflow equations is called Maximal Fixed Point solution (MFP)

•  For any Fixed-Point (FP) solution of the equations: FP ⊆ MFP

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 178

Meet Over Paths Solution (MOP) •  Is MFP the best solution to the Analysis Problem?

•  Another approach: consider a lattice framework, but use a different way to compute the solution –  Let G be the control flow graph with start node n0 –  For each path pk=[n0, n1, …, nk] from entry to node nk:

in[pk] = Fnk-1 ( … (Fn1(Fn0(d0)))) –  Compute solution as

in[n] = ∨ { in[pk] | all paths pk from n0 to nk}

•  This solution is the Meet Over Paths solution (MOP)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 179

MFP versus MOP •  Precision: can prove that MOP solution is always more precise

than MFP

MFP ⊆ MOP

•  Why not use MOP? •  MOP is intractable in practice

1. Exponential number of paths: for a program consisting of a sequence of N if statements, there will 2N paths in the control flow graph

2. Infinite number of paths: for loops in the CFG

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 180

Importance of Distributivity

•  Property: if transfer functions are distributive, then the solution to the dataflow equations is identical to the meet-over-paths solution

MFP = MOP •  For distributive transfer functions, can compute the intractable

MOP solution using the iterative fixed-point algorithm

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 181

Can We Do Better Than MOP? •  Is MOP the best solution to the analysis problem?

•  MOP computes solution for all path in the CFG •  There may be paths which will

never occur in any execution •  So MOP is conservative

•  IDEAL = solution which takes into account only paths which occur in some execution

•  This is the best solution –  but it is undecidable

x = 1 x = 2

y = y+2

if (c)

if (c)

y = x+1

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 182

Summary •  Data-Flow Analysis

–  Sets up system of equations –  Iteratively computes MFP –  Terminates because transfer functions are monotonic and lattice has

finite height

•  Other possible solutions: FP, MOP, IDEAL •  All are safe solutions, but some are more precise:

FP ⊆ MFP ⊆ MOP ⊆ IDEAL •  MFP = MOP if distributive transfer functions

•  MOP and IDEAL are intractable •  Compilers use dataflow analysis and MFP

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 183

Outline •  Overview of Control-Flow Analysis •  Available Expressions •  Algorithm for Calculating Available Expressions •  Practical Issues: Bit sets •  Formulating a Data-Flow Analysis Problem •  DU chains •  SSA form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 184

Def-Use and Use-Def Chains

•  Def-Use (DU) Chain –  Connects a definition of each variable vk to all the possible

uses of that variable –  A definition of vk at point p reaches point q if there is a path

from p to q where vk is not redefined.

•  Use-Def (UD) Chain –  Connects a use of a variable vk to all the possible definitions

of that variable

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 185

DU-Chain Data-Flow Problem Formulation

•  Lattice: The set of Definitions –  Bit-vector format: a bit for each variable definition in the procedure –  Label the definitions in the input program as d1,vk, d2,vk, …

•  Flow Direction: Forward Flow •  Flow Functions:

–  Gen(n) = { di,…, di,n | where di,vk = 1 for definition di,vk in n not killed inside the same basic block by a subsequent definition*}

–  Kill(n) = { di,…, di,n | where di,vk = 1 iff variable vk is defined in n} –  OUT(n) = Gen(n) ∪ (IN(n) – Kill(n))

–  IN(n) = ∪ OUT(p) for all predecessors nodes p of node n

* This is the notion of downwards exposed definition

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu

Gen and Kill Functions

•  Gen = Downwards Exposed Definitions –  Dual to Upwards Exposed Reads (see Live Variables Analysis) –  Can be computed on a Forward pass of the Basic Block

•  Keep a list of variables defined in the block •  Remove and keep only the last definition as you go along

186

k = … 1

i = … 2

j = … 3

i = i + … 4

BBn

Gen(n) = { d1, d3 , d4 } Kill(n) = { d1, d2, d3, d4, … }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 187

DU Example entry

k = false i = 1 j = 2

j = j * 2 k = true i = i + 1 print j i = i + 1

k

exit

i < n

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 188

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 189

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 190

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { } IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 191

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { } IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 192

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { } IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 193

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 194

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 195

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 196

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 197

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { }

OUT = { } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 198

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { }

OUT = { 4, 5, 6 } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 199

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { }

OUT = { 4, 5, 6 } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 200

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 201

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 202

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 203

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 204

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 205

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 206

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 207

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 208

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 209

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 210

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 211

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 212

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 213

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 214

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 215

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 216

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 217

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 218

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 219

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 220

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 221

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 222

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 223

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 224

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 225

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6

print j i = i + 1 7

k

exit

i < n

gen ={ 1, 2, 3 } kill = { 4,5,6,7 }

gen ={ 4,5,6 } kill = { 1,2,3,7 }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ } kill = { }

gen ={ 7 } kill = { 2,6 }

OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { }

OUT = { 1, 2, 3, 4, 5, 6 }

OUT = IN = { 1, 2, 3, 4, 5, 6 }

OUT = { 4, 5, 6 }

OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }

IN= { 1, 2, 3, 4, 5, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu

DU Example entry

k = false 1 i = 1 2 j = 2 3

j = j * 2 4 k = true 5 i = i + 1 6 print j i = i + 1 7

k

exit

i < n IN = { 1, 2, 3, 4, 5, 6 }

IN = { }

IN = { 1, 2, 3, 4, 5, 6 }

IN = { 1, 2, 3, 4, 5, 6 }

IN = { 1, 2, 3, 4, 5, 6, 7 }

IN = { 1, 2, 3, 4, 5, 6 }

IN = { 1, 2, 3, 4, 5, 6 }

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 228

DU Chains •  At each use of a variable, indicates all its possible

definitions (and thus its points) –  Very Useful Information –  Used in Many Optimizations

•  Information can be Incorporate in the representation –  SSA From

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 229

Outline •  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 230

Static Single Assignment (SSA) Form

•  Each definition has a unique variable name –  Original name + a version number

•  Each use refers to a definition by name

•  What about multiple possible definitions? –  Add special merge nodes so that there can be only a single definition

(Φ functions)

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 231

a = 1 b = a + 2 c = a + b a = a + 1 d = a + b

Static Single Assignment (SSA) Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 232

a = 1 b = a + 2 c = a + b a = a + 1 d = a + b

a1 = 1 b1 = a1 + 2 c1 = a1 + b1 a2 = a1 + 1 d1 = a2 + b1

Static Single Assignment (SSA) Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 233

a = 1 c = a + 2

b = 1 c = b + 2

d = a + b + c

Static Single Assignment (SSA) Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu

a = 1 c = a + 2

b = 1 c = b + 2

d = a + b + c

a1 = 1 c1 = a1 + 2

b1 = 1 c2 = b1 + 2

c3 = Φ(c1, c2) d1 = a1 + b1 + c3

Static Single Assignment (SSA) Form

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 235

DU Example entry

k = false i = 1 j = 2

j = j * 2 k = true i = i + 1 print j i = i + 1

k

exit

i < n

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 236

DU Example entry

k1 = false i1 = 1 j1 = 2

j2 = j3 * 2 k2 = true i2 = i3 + 1 print j3 i4 = i3 + 1

k3

i5 = Φ(i3, i4) exit

i3 = Φ(i1, i2) j3 = Φ(j1, j2) k3 = Φ(k1, k2) i1 < n

Spring 2011 CSCI 565 - Compiler Design

Pedro Diniz pedro@isi.edu 237

Summary

•  Overview of Control-Flow Analysis •  Available Expressions Data-Flow Analysis Problem •  Algorithm for Computing Available Expressions •  Practical Issues: Bit Sets •  Formulating a Data-Flow Analysis Problem •  DU Chains •  SSA Form

Recommended