data-flow analysis: reaching definitions

16
DATA-FLOW ANALYSIS

Upload: leandro-lera-romero

Post on 21-Jun-2015

152 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Data-flow Analysis: Reaching Definitions

DATA-FLOW ANALYSIS

Page 2: Data-flow Analysis: Reaching Definitions

/ 16

• ¿Para qué hacemos data-flow analysis?

•Optimizar el código.•Detectar errores.

DATA-FLOW ANALYSIS

2

Page 3: Data-flow Analysis: Reaching Definitions

/ 16

• Es un método para detectar posibles usos de variables antes de ser definidas.

• Es un tipo de análisis estático que determina cuales son las definiciones que pueden alcanzar un punto dado en el código.

• Es un análisis hacia delante (forward).

REACHING DEFINITIONS

3

Page 4: Data-flow Analysis: Reaching Definitions

/ 16

• Una definición de una variable x es una sentencia que asigna, o puede asignar, un valor a x.

• Una definición d alcanza un punto p si existe un camino entre ellos tal que d no es reemplazada por otra definición.

REACHING DEFINITIONS

4

Page 5: Data-flow Analysis: Reaching Definitions

/ 16

• Por ejemplo: • Genera una definición d de la variable u.

• Reemplaza a todas las anteriores definiciones de u.•Deja las definiciones del resto de las variables sin

modificar.

• La función de transferencia de una definición d:

donde = y el resto de las definiciones de u.

REACHING DEFINITIONS

5

1. Introduccion

d : u = x+ y

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

fd(x) = gend [ (x� killd)

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

gend

{d}killdgenB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

gend

{d}killdgenB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

gend

{d}killdgenB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

Page 6: Data-flow Analysis: Reaching Definitions

/ 16

• ¿Cómo determinamos las definiciones para todo el código?

REACHING DEFINITIONS

6

- Calculamos gen y kill para cada bloque- out[entry] = ∅- Por cada bloque B que no sea entry: out[B] = ∅- Mientas (algún out[] cambie) Por cada bloque B que no sea entry

in[B] = U(out[p]), para todos los predecesores p de Bout[B] = fB(in[B])

Page 7: Data-flow Analysis: Reaching Definitions

/ 167

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

Page 8: Data-flow Analysis: Reaching Definitions

/ 168

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

1. Introduccion

genB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

genB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

genB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

1. Introduccion

genB1 = {d1, d2, d3}killB1 = {}genB2 = {d4, d5}killB2 = {d1, d2}genB3 = {d6}killB3 = {d3}genB4 = {d7}killB4 = {d1, d4}genB2 = {d4, d5}killB2 = {d1, d2, d7}

2. Diagrama de Entidad Relacion

3. Modelo Relacional

4. Codigo de las funcionalidades

3

killB1 = {d4, d5, d6, d7}

1. Introduccion

Intro...

3

Page 9: Data-flow Analysis: Reaching Definitions

/ 169

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

1. Introduccion

Intro...

3

Page 10: Data-flow Analysis: Reaching Definitions

/ 1610

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5}

OUT [B3] = {d4, d5, d6}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}

gB2 = {d4, d5} kB2 = {d1, d2, d7}

gB3 = {d6} kB3 = {d3}

gB4 = {d7} kB4 = {d1, d4}

fBi(x) = genBi [ (x� killBi)

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

1. Introduccion

Intro...

3

Page 11: Data-flow Analysis: Reaching Definitions

/ 16

• ¿Cómo hacemos para detectar variables usadas antes de ser definidas?

REACHING DEFINITIONS

11

Page 12: Data-flow Analysis: Reaching Definitions

/ 16

• ¿Cómo hacemos para detectar variables usadas antes de ser definidas?

Agregamos una definición ficticia de la variable a testear y vemos si llegamos a un posible uso.

REACHING DEFINITIONS

12

Page 13: Data-flow Analysis: Reaching Definitions

/ 1613

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

1. Introduccion

Intro...

3

Page 14: Data-flow Analysis: Reaching Definitions

/ 1614

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

IN [B4] = {d0, ...}

1. Introduccion

Intro...

3

...

Page 15: Data-flow Analysis: Reaching Definitions

/ 1615

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

604 CHAPTER 9. MACHINE-INDEPENDENT OPTIMIZATIONS

ENTRY '-----

gen = { d6 1 B3

kill ={4} B3

senB4 = { d, 1 kill = { dl, d4 }

B4

Figure 9.13: Flow graph for illustrating reaching definitions

This rule extends to a block consisting of any number of statements. Suppose block B has n statements, with transfer functions f i ( x ) = geni U ( x - killi) for i = 1 ,2 , . . . , n. Then the transfer function for block B may be written as:

where

killB = killl U kill2 U . - . U kill,

and

g e n ~ = gen, U (gen,-1 - kill,) U (gennV2 - - kill,) U

- - . U (genl - killz - kills - . - . - kill,)

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

1. Introduccion

Intro...

3

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

IN [B4] = {d0, ...}

1. Introduccion

Intro...

3

Oops! Llegué a un uso de la definición ficticia...

...

Page 16: Data-flow Analysis: Reaching Definitions

/ 16

RESUMIENDO

• Ataca el problema de uso de variables no definidas.

• Genera el conjunto de definiciones para cada punto del código.

• Análisis forward.

• Función de transferencia:

16

killB1 = {d4, d5, d6, d7}

gB1 = {d1, d2, d3} k

B1 = {d4, d5, d6, d7}

gB2 = {d4, d5} k

B2 = {d1, d2, d7}

gB3 = {d6} k

B3 = {d3}

gB4 = {d7} k

B4 = {d1, d4}

fBi(x) = gen

Bi [ (x� killBi)

IN [B] =

Sp predecesor de B

OUT [p]

OUT [B] = f(IN [B])

OUT [entry] = ;

OUT [B1] = {d1, d2, d3}

OUT [B2] = {d3, d4, d5, d6}

OUT [B3] = {d4, d5, d6}

OUT [B4] = {d3, d5, d6, d7}

d0 : u3 = �1

IN [B4] = {d0, ...}

1. Introduccion

Intro...

3