Data-flow Analysis: Reaching Definitions2. / 16
• ¿Para qué hacemos data-flow analysis?
• Optimizar el código.
• Detectar errores.
DATA-FLOW ANALYSIS
2
3. / 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
4. / 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
5. / 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. Introducci´on
d : u = x + y
2. Diagrama de Entidad Re
3. Modelo Relacional
4. C´odigo de las funcionalid
1. Introducci´on
fd(x) = gend [ (x killd)
2. Diagrama de Entidad Relaci´o
1. Introducci´on
gend
{d}
killd
1. Introducci´on
gend
{d}
killd
genB1
= {d1, d2, d3}
1. Introducci´on
gend
{d}
killd
genB1
= {d1, d2, d3}
killB1
= {}
6. / 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 B
out[B] = fB(in[B])
8. / 168
ENTRY
'-----
gen = { d6 1
B3
kill ={4}B3
senB4 = { d, 1
kill = { dl, d4 }
B4
1. Introducci´on
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 En
3. Modelo Relacio
1. Introducci´on
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}
1. Introducci´on
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}
1. Introducci´on
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 Ent
3. Modelo Relacion
4. C´odigo de las fun
killB1
= {d4, d5, d6, d7}
1. Introducci´on
Intro...
9. / 169
ENTRY
'-----
gen = { d6 1
B3
kill ={4}B3
senB4 = { d, 1
kill = { dl, d4 }
B4
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}
1. Introducci´on
Intro...
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. Introducci´on
Intro...
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. Introducci´on
Intro...
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}
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}
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7
gB2
= {d4, d5} kB2
= {d1, d2, d7}
1. Introducci´on
Intro...
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6,
gB2
= {d4, d5} kB2
= {d1, d2, d7}
1. Introducci´on
Intro...
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. Introducci´on
Intro...
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d
gB2
= {d4, d5} kB2
= {d1, d2, d7}
gB3 = {d6} kB3 = {d3}
1. Introducci´on
Intro...
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}
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5,
gB2
= {d4, d5} kB2
= {d1, d2, d7}
gB3 = {d6} kB3 = {d3}
gB4
= {d7} kB4
= {d1, d4}
fBi
(x) = genBi
[ (x killBi
)
1. Introducci´on
Intro...
gB4
= {d7} kB4
= {d1, d4}
fBi
(x) = genBi
[ (x killBi
)
OUT[B] = f(IN[B])
1. Introducci´on
Intro...
B4 7 B4 1 4
fBi
(x) = genBi
[ (x killBi
)
OUT[B] = f(IN[B])
OUT[entry] = ;
1. Introducci´on
Intro...
fBi
(x) = genBi
[ (x killBi
)
IN[B] =
S
p 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. Introducci´on
Intro...
10. / 1610
ENTRY
'-----
gen = { d6 1
B3
kill ={4}B3
senB4 = { d, 1
kill = { dl, d4 }
B4
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7}
1. Introducci´on
Intro...
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. Introducci´on
Intro...
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. Introducci´on
Intro...
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}
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. Introducci´on
Intro...
gB4
= {d7} kB4
= {d1, d4}
fBi
(x) = genBi
[ (x killBi
)
OUT[B] = f(IN[B])
1. Introducci´on
Intro...
B4 7 B4 1 4
fBi
(x) = genBi
[ (x killBi
)
OUT[B] = f(IN[B])
OUT[entry] = ;
1. Introducci´on
Intro...
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6, d7
gB2
= {d4, d5} kB2
= {d1, d2, d7}
1. Introducci´on
Intro...
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d6,
gB2
= {d4, d5} kB2
= {d1, d2, d7}
1. Introducci´on
Intro...
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. Introducci´on
Intro...
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5, d
gB2
= {d4, d5} kB2
= {d1, d2, d7}
gB3 = {d6} kB3 = {d3}
1. Introducci´on
Intro...
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}
killB1
= {d4, d5, d6, d7}
gB1 = {d1, d2, d3} kB1 = {d4, d5,
gB2
= {d4, d5} kB2
= {d1, d2, d7}
gB3 = {d6} kB3 = {d3}
gB4
= {d7} kB4
= {d1, d4}
gB4
= {d7} kB4
= {d1, d4}
fBi
(x) = genBi
[ (x killBi
)
OUT[B] = f(IN[B])
OUT[entry] = ;
OUT[B1] = {d1, d2, d3}
1. Introducci´on
Intro...
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. Introducci´on
Intro...
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}
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. Introducci´on
Intro...
fBi
(x) = genBi
[ (x killBi
)
IN[B] =
S
p 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. Introducci´on
Intro...
11. / 16
• ¿Cómo hacemos para detectar variables usadas antes de ser
definidas?
REACHING DEFINITIONS
11
12. / 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
13. / 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
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
OUT[B3] = {d4, d5, d6}
OUT[B4] = {d3, d5, d6, d7}
d0 : u3 = 1
1. Introducci´on
Intro...
14. / 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
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
OUT[B3] = {d4, d5, d6}
OUT[B4] = {d3, d5, d6, d7}
d0 : u3 = 1
1. Introducci´on
Intro...
fBi
(x) = genBi
[ (x killBi
)
IN[B] =
S
p 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. Introducci´on
.
.
.
15. / 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
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
OUT[B3] = {d4, d5, d6}
OUT[B4] = {d3, d5, d6, d7}
d0 : u3 = 1
1. Introducci´on
Intro...
fBi
(x) = genBi
[ (x killBi
)
IN[B] =
S
p 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. Introducci´on
Oops! Llegué a un uso de la
definición ficticia...
.
.
.
16. / 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} 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
)
IN[B] =
S
p predecesor de B OUT[p]