Sie sind auf Seite 1von 219

Compiladores

Análisis de Flujo de Datos


Resumen
• Overview de análisis de control de flujo
• Expresiones disponibles
• Algoritmo para calcular expresiones disponibles
• Bit sets
• Formulando un problema de análisis de flujo de
datos
• Cadenas DU
• Forma SSA

2
Representando el control de flujo
del progama
• Forma un grafo

• Un grafo muy grande


• Crear Bloques Básicos
• Un Grafo de Control de Flujo (CFG) conecta
los Bloques Básicos
3
Grafo de Control de Flujo (CFG)
• Control-Flow Graph G = <N, E>
• Nodos(N): Bloques Básicos
• Edges(E): (x,y) ∈ E ssi la primera
instrucción en el bloque básico y sigue a la
última instrucción en el bloque básico x

4
Identificando loops de estructuras
recursivas
• Identificar aristas de retorno
bb1
• Encontrar los nodos y aristas en el
loop dado por la arista de retorno
• Aparte de la arista de retorno bb2
– Aristas entrantes sólo al bloque
básico con la cabeza de la arista bb3 bb4
de retorno
– Una arista saliente del bloque bb5
básico a la cola de la arista de
retorno
bb6
• ¿Cómo encontramos las aristas de
retorno?
5
Computando Dominators
• Algoritmo
– Hacer que el conjunto de dominators del nodo de
entrada sólo contenga ese nodo
– Hacer que el conjunto de dominators del resto de
los nodos contenga todos los nodos
– Visitar los nodos en cualquier orden
– Hacer que el conjunto de dominators del nodo
actual sea la intersección del conjunto de
dominators del nodo predecesor y el nodo actual
– Repetir hasta que no hayan cambios

6
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los
nodos contenga todos los nodos bb2
– Visitar los nodos en cualquier
orden
– Hacer que el conjunto de bb3 bb4
dominators del nodo actual sea la
intersección del conjunto de
dominators del nodo predecesor bb5
y el nodo actual
– Repetir hasta que no hayan bb6
cambios

7
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de bb1
bb2
dominators del resto de los bb3
nodos contenga todos los nodos bb4 bb2
bb5
– Visitar los nodos en cualquier bb1 bb6 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

8
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de bb1
bb2
dominators del resto de los bb3
nodos contenga todos los nodos bb4 bb2
bb5
– Visitar los nodos en cualquier bb1 bb6 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

9
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de bb1
bb2
dominators del resto de los bb3
nodos contenga todos los nodos bb4 bb2
bb5
– Visitar los nodos en cualquier bb1 bb6 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

10
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de bb1
bb2
dominators del resto de los bb3
nodos contenga todos los nodos bb4 bb2
bb5
– Visitar los nodos en cualquier bb1 bb6 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

11
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

12
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1 bb1
orden bb2 bb2
bb3 bb3 bb4 bb3
– Hacer que el conjunto de bb4 bb4
bb5 bb1 bb5
dominators del nodo actual sea la bb6 bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

13
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb1 bb5
dominators del nodo actual sea la bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

14
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb1 bb5
dominators del nodo actual sea la bb2 bb6
intersección del conjunto de bb3
dominators del nodo predecesor bb4 bb5
bb5
y el nodo actual bb6
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

15
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb5
dominators del nodo actual sea la bb6
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

16
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb5
dominators del nodo actual sea la bb6
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb4
bb5
bb6

17
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb5
dominators del nodo actual sea la bb6
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

18
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier bb1
orden bb1 bb2
bb2 bb3 bb4 bb3
– Hacer que el conjunto de bb3 bb4
bb5
dominators del nodo actual sea la bb6
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

19
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

20
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

21
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

22
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

23
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

24
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb3
bb5
y el nodo actual bb5
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

25
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

26
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb3
bb6
bb5
bb6

27
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

28
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

29
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

30
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

31
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

32
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

33
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

34
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

35
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

36
Computando Dominators
• Algoritmo
– Hacer que el conjunto de
dominators del nodo de entrada
sólo contenga ese nodo {bb1} bb1
– Hacer que el conjunto de
dominators del resto de los bb1
nodos contenga todos los nodos bb2 bb2
– Visitar los nodos en cualquier
orden bb1 bb1
– Hacer que el conjunto de
bb2
bb3
bb3 bb4 bb2
bb4
dominators del nodo actual sea la
intersección del conjunto de bb1
dominators del nodo predecesor
bb2
bb5
bb5
y el nodo actual
– Repetir hasta que no hayan bb1
cambios
bb2
bb5
bb6
bb6

37
Computando Dominators
• Lo que acabamos de ver fue un algoritmo
iterativo de análisis de flujo de datos en
acción
– Inicializar todos los nodos a un valor dado
– Visitar los nodos en algún orden
– Calcular el valor del nodo
– Repetir hasta que no haya cambios

38
Análisis de Flujo de Datos
• Análisis Local
– Analizar el efecto de cada instrucción
– Componer efectos de instrucciones para derivar información
desde el principio del bloque básico a cada instrucción
• Análisis de Flujo de Datos
– Iterativamente propagar la información del bloque básico
sobre el grafo de control de flujo hasta que no hayan cambios
– Calcular el valor final al principio del bloque básico
• Propagación Local
– Propagar la información desde el principio del bloque básico
a cada instrucción

39
Resumen
• Overview de análisis de control de flujo
• Expresiones disponibles
• Algoritmo para calcular expresiones disponibles
• Bit sets
• Formulando un problema de análisis de flujo de
datos
• Cadenas DU
• Forma SSA

40
Ejemplo: Expresiones Disponibles
• Una expresión está disponible ssi
– Todos los caminos que llegan al punto actual
pasan a través del punto donde se definió la
expresión
– Ninguna variable usada en la expresión fue
modificada entre el punto en que se definió la
expresión y el punto actual

41
Ejemplo: Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

42
¿Está la expresión disponible?
a=b+c
Sí!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

43
¿Está la expresión disponible?
a=b+c
Sí!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

44
¿Está la expresión disponible?
a=b+c
No!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

45
¿Está la expresión disponible?
a=b+c
No!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

46
¿Está la expresión disponible?
a=b+c
No!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

47
¿Está la expresión disponible?
a=b+c
Sí!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

48
¿Está la expresión disponible?
a=b+c
Sí!
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

49
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

50
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

51
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

52
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=f
h=c+f

j=a+b+c+d

53
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=f
h=c+f

j=a+b+c+d

54
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=f
h=c+f

j=a+c+b+d

55
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=f
h=c+f

j=f+ b+d

56
Uso de Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=f
h=c+f

j=f+ b+d

57
Resumen
5

• Overview de análisis de control de flujo


• Expresiones Disponibles
• Algoritmo para calcular expresiones
disponibles
• Bit sets
• Formulando un problema de análisis de flujo
de datos
• Cadenas DU
• Forma SSA
58
Algoritmo para Expresiones
Disponibles
• Asignar un número a cada expresión

59
Ejemplo: Expresiones Disponibles
a=b+c
d=e+f
f=a+c

b=a+d
g=a+c
h=c+f

j=a+b+c+d

60
Ejemplo: Expresiones Disponibles
a=b+c 1
d=e+f 2
f=a+c 3

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

j=a+b+c+d 7

61
Conjuntos Gen y Kill
• Conjunto Gen
– Si el bloque básico actual (o instrucción) crea la
definición, está en el conjunto gen
– El elemento debe estar en la salida del bloque
básico siempre
• Conjunto Kill
– Si el bloque básico actual (o instrucción)
redefine una variable en la expresión, está en el
conjunto kill
– La expresión no es válida después de esto

62
Algoritmo para Expresiones 15

Disponibles
• Asignar un número a cada expresión
• Calcular conjuntos gen y kill para cada
expresión

63
Conjuntos Gen y Kill
a=b+c 1
d=e+f 2
f=a+c 3

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

j=a+b+c+d 7

64
Conjuntos Gen y Kill
a=b+c 1 a=b+c 1
d=e+f 2
f=a+c 3

d=e+f 2

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

f=a+c 3

j=a+b+c+d 7

65
Conjuntos Gen y Kill
a=b+c 1
gen = { b + c } a=b+c 1
d=e+f 2
kill = { cualquier expr con a } f=a+c 3

d=e+f 2
gen = { e + f }
kill = { cualquier expr con d } b=a+d 5
g=a+c 4 h=c+f 6
f=a+c 3
gen = { a + c }
kill = {cualquier expr con f }
j=a+b+c+d 7

66
Conjuntos Gen y Kill
a=b+c 1 a=b+c 1
gen = { 1 } d=e+f 2
f=a+c 3
kill = { 3, 4, 5, 7 }

d=e+f 2
gen = { 2 }
b=a+d 5
kill = { 5, 7 } g=a+c 4 h=c+f 6

f=a+c 3
gen = { 3 }
kill = { 2, 6 }
j=a+b+c+d 7

67
Algoritmo para Expresiones 16

Disponibles
• Asignarle un número a cada expresión
• Calcular conjuntos gen y kill para cada
expresión
• Calcular conjuntos gen y kill agregados para
cada bloque básico

68
Conjuntos Gen y Kill agregados
a=b+c 1 • Propagar todos los
gen = { 1 } conjuntos gen y kill desde
kill = { 3, 4, 5, 7 } el comienzo del bloque
básico hasta el final del
d=e+f 2 bloque básico
gen = { 2 }
kill = { 5, 7 }

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

69
Conjunto Gen agregado
InGEN set

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

OutGEN set

OutGEN =

70
Conjunto Gen agregado
InGEN set
• El conjunto gen en la expresión
actual debe estar en el conjunto
OutGEN a=b+c 1
gen = { 1 }
kill = { 3, 4, 5, 7 }

OutGEN set

OutGEN = gen

71
Conjunto Gen agregado
InGEN set
• El conjunto gen en la expresión
actual debe estar en el conjunto
OutGEN a=b+c 1
gen = { 1 }
• Cualquier expresión en el
kill = { 3, 4, 5, 7 }
conjunto InGEN que no está en
el conjunto kill debe estar en el
conjunto OutGEN OutGEN set

OutGEN = gen ∪ (InGEN - kill)

72
Conjunto Gen agregado

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 }

73
Conjunto Gen agregado
InGEN = { }

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

OutGEN = gen ∪ (InGEN - kill)

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

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

74
Conjunto Gen agregado
InGEN = { }

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

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

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

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

75
Conjunto Gen agregado
InGEN = { }

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

OutGEN = { 1 }

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

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

76
Conjunto Gen agregado
a=b+c 1
gen = { 1 }
kill = { 3, 4, 5, 7 }

InGEN = { 1 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutGEN = gen ∪ (InGEN - kill)
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

77
Conjunto Gen agregado

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

InGEN = { 1 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutGEN = { 2 } ∪ ({ 1 } - { 5,7 })
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

78
Conjunto Gen agregado

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

InGEN = { 1 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutGEN = { 1, 2 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

79
Conjunto Gen agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InGEN = { 1, 2 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutGEN = gen ∪ (InGEN - kill)
80
Conjunto Gen agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InGEN = { 1, 2 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutGEN = { 3 } ∪ ({ 1,2 } - { 2,6 })
81
Conjunto Gen agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InGEN = { 1, 2 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutGEN = { 1, 3 }
82
Conjunto Gen agregado

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

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

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

83
Conjunto Kill agregado
InKILL set

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

OutKILL set

OutKILL =

84
Conjunto Kill agregado
InKILL set
• El conjunto kill de la expresión
actual debe estar en el conjunto
OutKILL a=b+c 1
gen = { 1 }
kill = { 3, 4, 5, 7 }

OutKILL set

OutKILL = kill

85
Conjunto Kill agregado
InKILL set
• El conjunto kill de la expresión
actual debe estar en el conjunto
OutKILL a=b+c 1
gen = { 1 }
• Cualquier conjunto en el
kill = { 3, 4, 5, 7 }
InKILL debe estar en el
OutKILL
OutKILL set

OutKILL = kill ∪ InKILL

86
Conjunto Kill agregado

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 }

87
Conjunto Kill agregado
InKILL = { }

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

OutKILL = kill ∪ InKILL

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

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

88
Conjunto Kill agregado
InKILL = { }

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

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

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

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

89
Conjunto Kill agregado
InKILL = { }

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

OutKILL = { 3,4,5,7 }

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

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

90
Conjunto Kill agregado

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

InKILL = { 3,4,5,7 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutKILL = kill ∪ InKILL
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

91
Conjunto Kill agregado

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

InKILL = { 3,4,5,7 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutKILL = { 5,7 } ∪ { 3,4,5,7 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

92
Conjunto Kill agregado

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

InKILL = { 3,4,5,7 }

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
OutKILL = { 3,4,5,7 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }

93
Conjunto Kill agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InKILL = { 3,4,5,7 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutKILL = kill ∪ InKILL
94
Conjunto Kill agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InKILL = { 3,4,5,7 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutKILL = { 3,4,5,7 } ∪ { 2,6 }
95
Conjunto Kill agregado

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

d=e+f 2
gen = { 2 }
kill = { 5, 7 }
InKILL = { 3,4,5,7 }
f=a+c 3
gen = { 3 }
kill = { 2, 6 }
OutKILL = { 2,3,4,5,6,7 }
96
Conjunto Kill agregado
KILL = { 2, 3, 4, 5, 6, 7 } 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 }

97
Conjuntos Gen y Kill agregados

a=b+c 1 Gen = { 1, 3}
d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

Gen = { 4 } b=a+d 5 Gen = { 5, 6 }


g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }

j=a+b+c+d 7 Gen = { 7 }
Kill = { }

98
Algoritmo para Expresiones 20

Disponibles
• Asignar un número a cada expresión
• Calcular conjuntos gen y kill para cada
instrucción
• Calcular conjuntos gen y kill agregados para
cada bloque básico
• Inicializar conjunto de disponibles de cada
bloque básico con todas las expresiones

99
Conjuntos Gen y Kill agregados
IN = {1,2,3,4,5,6,7}
a=b+c 1 Gen = { 1, 3}
d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}
j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
100
Algoritmo para Expresiones
Disponibles
• Asignar un número a cada expresión
• Calcular conjuntos gen y kill para cada
instrucción
• Calcular conjuntos gen y kill agregados para
cada bloque básico
• Inicializar conjunto de disponibles de cada
bloque básico con todas las expresiones
• Iterativamente propagar el conjunto de
expresiones disponibles por el CFG
101
Propagar conjunto de disponibles
IN set

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

OUT set

OUT =
102
Propagar conjunto de disponibles
IN set
• Si la expresión es generada (en
el conjunto gen) entonces está
disponible al final gen = { … }
– Debe estar en el conjunto OUT kill = { ... }

OUT set

OUT = gen
103
Propagar conjunto de disponibles
IN set
• Si la expresión es generada (en
el conjunto gen) entonces está
disponible al final gen = { … }
– Debe estar en el conjunto OUT kill = { ... }
• Cualquier expresión disponible
en la entrada (en el conjunto IN)
y que no está en el conjunto kill OUT set
debe estar disponible al final

OUT = gen ∪ (IN - kill)


104
Propagar conjunto de disponibles

et
U

Ts
T
se

OU
t

IN set

IN =
OUT = gen ∪ (IN - kill)
105
Propagar conjunto de disponibles
• La expresión está
disponible sólo está O

et
U

Ts
T
disponible en todos los se

OU
t
caminos de entrada
IN set

IN = ∩ OUT
OUT = gen ∪ (IN - kill)
106
Conjuntos Gen y Kill agregados
IN = {1,2,3,4,5,6,7}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
107
Conjuntos Gen y Kill agregados
IN = {1,2,3,4,5,6,7}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
108
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
109
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
110
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
111
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 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}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
112
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}

j=a+b+c+d 7 Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
113
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,2,3,4,5,6,7}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
114
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,2,3,4,5,6,7}
115
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
116
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,2,3,4,5,6,7}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
117
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {1,2,3,4,5,6,7}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
118
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
119
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
120
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
121
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {1,3,4}

j=a+b+c+d 7
Gen = { 7 }
Kill = { }
OUT = {1,3,4,7}
122
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {1,3,4}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {1,3,4,7}
123
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {1,3,4,7}
124
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
125
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {1,3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
126
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
127
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
128
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
129
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
Kill = { } g=a+c 4 h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
130
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
131
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
132
Conjuntos Gen y Kill agregados
IN = {}
IN = ∩ OUT a=b+c 1 Gen = { 1, 3}
OUT = gen ∪ (IN - kill) d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

OUT = {1,3}
IN = {3}
IN = {1,3}
Gen = { 4 } b=a+d 5 Gen = { 5, 6 }
g=a+c 4
Kill = { } h=c+f 6 Kill = { 1, 7 }
OUT = {1,3,4} OUT = {3,5,6}
IN = {3}
Gen = { 7 }
j=a+b+c+d 7
Kill = { }
OUT = {3,7}
133
Algoritmo para Expresiones 28

Disponibles
• Asignar un número a cada expresión
• Calcular conjuntos gen y kill para cada instrucción
• Calcular conjuntos gen y kill agregados para cada
bloque básico
• Inicializar conjunto de disponibles en cada bloque
básico con todas las expresiones
• Iterativamente propagar expresiones disponibles sobre
el CFG
• Propagar dentro del bloque básico

134
Propagar dentro del bloque básico
IN set
• Comenzar con el conjunto IN de
expresiones disponibles
• Linealmente propagar hacia a=b+c 1
gen = { 1 }
abajo del bloque básico
kill = { 3, 4, 5, 7 }
– Igual que el paso de data-flow
– Una sola pasada ya que no hay
aristas de retorno OUT set

OUT = gen ∪ (IN - kill)

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

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

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

• Overview de análisis de control de flujo


• Expresiones Disponibles
• Algoritmo para calcular expresiones
disponibles
• Bit sets
• Formulando un problema de análisis de flujo
de datos
• Cadenas DU
• Forma SSA
137
Bitsets
• Asignar un bit a cada elemento del conjunto
– Unión ⇒ OR
– Intersección ⇒ AND
– Subtracción ⇒ NEGATE y AND
• Implementación rápida
– 32 elementos empacados en cada word
– AND y OR son ambas una instrucción

138
Conjunto Kill vrs. Conjunto Preserve
• Conjuntos Kill
– OUT = gen ∪ (IN - kill)
– Usando vectores de bits: OUT = gen ∨(IN - kill)
– Subtracción ⇒ NEGATE y AND
– OUT = gen ∨(IN ∧¬ kill)
• Conjuntos Preserve
– Usados en el libro de la Ballena
– PRSV = Entire Set - KILL
– OUT = gen ∪ (IN ∩ prsv)
– OUT = gen ∨(IN ∧ prsv)

139
Conjuntos Gen y Kill agregados

a=b+c 1 Gen = { 1,3}


d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

Gen = { 4 } b=a+d 5 Gen = { 5,6 }


g=a+c 4
Kill = { } h=c+f 6 Kill = { 1,7 }

j=a+b+c+d 7 Gen = { 7 }
Kill = { }

140
Conjuntos Gen y Kill agregados
•Se requieren 7 bits por
conjunto a=b+c 1 Gen = { 1,3}
d=e+f 2 Kill = { 2,3,4,5,6,7 }
f=a+c 3

Gen = { 4 } b=a+d 5 Gen = { 5,6 }


g=a+c 4
Kill = { } h=c+f 6 Kill = { 1,7 }

j=a+b+c+d 7 Gen = { 7 }
Kill = { }

141
Conjuntos Gen y Kill agregados
•Se requieren 7 bits por
conjunto a=b+c 1 Gen = 1010000
d=e+f 2 Kill = 0111111
f=a+c 3

Gen = 0001000 b=a+d 5 Gen = 0000110


g=a+c 4 h=c+f 6
Kill = 0000000 Kill = 1000001

j=a+b+c+d 7 Gen = 0000001


Kill = 0000000

142
Resumen
5

• Overview de análisis de control de flujo


• Expresiones Disponibles
• Algoritmo para calcular expresiones
disponibles
• Bit sets
• Formulando un problema de análisis de flujo
de datos
• Cadenas DU
• Forma SSA
143
Formulando un problema de
análisis de flujo de datos
• Independiente del problema
– Calcular conjuntos gen y kill para bloque básico
– Propagación iterativa de información hasta que
converja
– Propagación de información dentro del bloque
básico

144
Formulando un problema de
análisis de flujo de datos
• Lattice
– Estructuras abstractas sobre las que opera el análisis
ejemplo: conjuntos de expresiones disponibles

• Funciones de flujo
– Cómo cada control de flujo y construcciones
computacionales afectan las estructuras abstractas
• Ejemplo: la ecuación OUT de cada statement

145
Lattice
• Una lattice L consiste de
– Un conjunto de valores
– Dos operaciones: meet( ∧ ) y join ( ∨ )
– Un valor superior [top] (T) y un valor inferior
[bottom] (⊥ )

146
Lattice
• Ejemplo: el lattice para el problema de “reaching
definition” cuando sólo hay 3 definiciones

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
147
Operaciones Meet y Join
• Meet y Join forman una “cerradura”
– Para todos a, b ∈ L existen c y d ∈ L únicos, tal que
a ∧b = c a ∨b = d
• Meet y Join con conmutativas
– a ∧b = b ∧a a ∨b = b ∨a
• Meet y Join son asociativas
– (a ∧ b) ∧ c = b ∧ (a ∧ c) (a ∨ b) ∨ c = b ∨ (a ∨ c)
• Existe un único elemento (T) [top] y un único
elemento (⊥ ) [bottom] en L tal que
– a ∧⊥ = ⊥ a ∨T = T

148
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
149
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
150
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
151
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
152
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
153
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
154
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
155
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
156
Operaciones Meet y Join

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

T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
157
Operaciones Meet y Join
• Operación Meet
– Intersección de conjuntos
– Seguir las líneas hacia abajo desde los dos elementos
en el lattice hasta que se encuentren en un sólo
elemento único
• Operación Join
– Unión de conjuntos
– Hay un sólo elemento en el lattice desde el que hay
un camino hacia abajo (sin segmentos compartidos)
hacia ambos elementos

158
Orden Parcial
• Definimos a ⊆ b sí y sólo sí a ∧b = b
• Propiedades
– Reflexivo: a ⊆ a
– Antisimétrico: a ⊆ b y b ⊆ a ⇒ a = b
– Transitivo: a ⊆ b y b ⊆ c ⇒ a ⊆ c

159
Orden Parcial
• Definimos a ⊆ b sí y sólo sí a ∧b = b
• Propiedades
– a ⊆ b ⇒ existe un camino desde b hasta a
T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }
160
Alto del Lattice
• El alto del lattice es la cadena ascendiente
más larga en el lattice
– (T, a, b, c, …, ⊥ )

161
Alto del Lattice
• El alto del lattice es la cadena ascendiente más
larga en el lattice
– (T, a, b, c, …, ⊥ ) T = { d1, d2, d3 }
{ d2, d3 }

{ d1, d3 }
{ d1, d2 }
{ d2 } { d3 }

{ d1 }
⊥ ={ }

– Alto es (T, {d2,d3}, {d3}, ⊥ ) = 4


162
Funciones de Flujo
• Ejemplo: OUT = f(IN)
• f: L → L donde L es un lattice
• Propiedades
– Monótona: ∀a,b ∈ L a ⊆ b ⇒ f(a) ⊆ f(b)

• Punto Fijo
– Un punto fijo es un elemento a ∈L tal que
f(a) = a

163
Intuición acerca de Finalización
• El análisis de flujo de datos comienza asumiendo
los valores más optimistas (T)
• Cada etapa aplica funciones de flujo
– Vnew ⊆ Vprev
– Se mueve hacia abajo en el lattice
• Hasta que sea estable (valores no cambian)
– Se llega a un punto fijo en cada bloque básico

• Lattice tiene un alto finito ⇒ debe terminar

164
Resumen
5

• Overview de análisis de control de flujo


• Expresiones Disponibles
• Algoritmo para calcular expresiones
disponibles
• Bit sets
• Formulando un problema de análisis de flujo
de datos
• Cadenas DU
• Forma SSA
165
Cadenas Def-Use y Use-Def
• Cadena Def-Use (DU)
– Conecta la definición de cada variable con todos
los posibles usos de esa variable

• Cadena Use-Def (UD)


– Conecta el uso de una variable con todas las
posibles definiciones de esa variable

166
Formulación del problema de
flujo de datos para cadena DU
• Lattice: El conjunto de definiciones
– Bitvector format: un bit para cada definición en el
procedimiento
• Dirección del Flujo: Flujo hacia adelante
• Funciones de Flujo:
– gen = { b0…bn | bk = 1 ssi la k-ésima definición}
– kill = { b0…bn | bk = 1 ssi k-ésima variable es
redefinida }
– OUT = gen ∪ (IN - kill)
– IN = ∪ OUT
167
Formulen el problema de flujo de
datos para la cadena UD
• Lattice:
– Bitvector format:
• Dirección del Flujo: Flujo hacia adelante/atrás
• Funciones de flujo:
– gen = { b0…bn | bk = 1 }
– kill = { b0…bn | bk = 1 }
– OUT =
– IN =

168
Ejemplo DU
entry

k = false
i=1
j=2

i<n

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

exit

169
Ejemplo DU
entry

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

i<n

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

exit

170
Ejemplo DU
entry

k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }

gen ={ }
i<n
kill = { }

gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
kill = { } 7 kill = { 2,6 }

exit

171
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { }
IN = { }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

172
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { }
IN = { }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

173
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { }
IN = { }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

174
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

175
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

176
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

177
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

178
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { } kill = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

179
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
kill
OUT = { 4, 5, 6 } = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

180
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
kill
OUT = { 4, 5, 6 } = { } 7 OUT = { }kill = { 2,6 }
OUT = { }
IN = { }
exit

181
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
={ } 7 OUT = { }
kill = { 2,6 }
IN = { }
exit

182
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
={ } 7 OUT = { }
kill = { 2,6 }
IN = { }
exit

183
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 OUT = { }
kill = { 2,6 }
IN = { }
exit

184
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 OUT = { }
kill = { 2,6 }
IN = { }
exit

185
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { }
exit

186
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

187
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

188
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

189
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

190
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

191
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

192
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

193
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

194
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

195
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

196
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

197
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 7 }
IN = { 1, 2, 3, 7 }
exit

198
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 7 }
exit

199
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

200
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

201
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

202
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

203
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

204
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

205
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

206
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

207
Ejemplo DU
entry
OUT = IN = { }
k = false 1
gen ={ 1, 2, 3 }
i=1 2
j=2 3 kill = { 4,5,6,7 }
OUT = { 1, 2, 3 }
IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
i<n
kill = { }
OUT = IN = { 1, 2, 3, 4, 5, 6 }
gen ={ }
k
j=j*2 4 gen ={ 4,5,6 } kill = { }
k = true 5 kill = { 1,2,3,7 } OUT = IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6 gen ={ } gen ={ 7 }
print j i=i+1
OUT = { 4, 5, 6 kill
} = { OUT
}
= { 1, 2, 3, 4, 5, 6 } 7 kill = { 2,6 }
OUT = { 1, 3, 4, 5, 7 }
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

208
Ejemplo DU
entry
IN = { }
k = false 1
i=1 2
j=2 3

IN = { 1, 2, 3, 4, 5, 6 }
i<n
IN = { 1, 2, 3, 4, 5, 6 }
IN = { 1, 2, 3, 4, 5, 6 }
k
j=j*2 4
k = true 5 IN = { 1, 2, 3, 4, 5, 6 } IN = { 1, 2, 3, 4, 5, 6 }
i=i+1 6
print j i=i+1
7
IN = { 1, 2, 3, 4, 5, 6, 7 }
exit

209
Cadenas DU
• En cada uso de la variable, apunta a todas las
posibles definiciones
– Información muy útil
– Usada en muchas optimizaciones

• Incorporar esta información en la


representación
– Forma SSA

210
Resumen
5

• Overview de análisis de control de flujo


• Expresiones Disponibles
• Algoritmo para calcular expresiones
disponibles
• Bit sets
• Formulando un problema de análisis de flujo
de datos
• Cadenas DU
• Forma SSA
211
Forma Static Single Assignment (SSA)
• Cada definición tiene un nombre único de variable
– Nombre original + número de versión

• Cada uso se refiere a la definición por nombre

• ¿Qué hay acerca de posibles definiciones múltiples?


– Agregamos nodos de union especiales (merge) para
que sólo pueda haber una definición (funciones Φ )

212
Forma Static Single Assignment (SSA)
a=1
b=a+2
c=a+b
a=a+1
d=a+b

213
Forma Static Single Assignment (SSA)
a=1
b=a+2
c=a+b
a=a+1
d=a+b

a1 = 1
b 1 = a1 + 2
c1 = a1 + b1
a2 = a1 + 1
d 1 = a2 + b 1

214
Forma Static Single Assignment (SSA)
a=1 b=1
c=a+2 c=b+2

d=a+b+c

215
Forma Static Single Assignment (SSA)
a=1 b=1
c=a+2 c=b+2

d=a+b+c

a1 = 1 b1 = 1
c1 = a1 + 2 c2 = b1 + 2

c3 = Φ (c1, c2)
d 1 = c3 + 2

216
Ejemplo DU
entry

k = false
i=1
j=2

i<n

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

exit

217
Ejemplo DU
entry

k1 = false
i1 = 1
j1 = 2

i3 = Φ (i1, i2)
j3 = Φ (j1, j2)
k3 = Φ (k1,
k2)
i1 < n
k3
j2 = j3 * 2
k2 = true
i2 = i3 + 1 print j3 i4 = i3 + 1

i5 = Φ (i3, i4)

218 exit
Lecturas
• Ballena
– Capítulo 12

• Tigre
– 17.1 - 17.4, 19.1, 19.2

219

Das könnte Ihnen auch gefallen