Compiladores Análisis de Flujo de Datos
2 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
3 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
4 Grafo de Control de Flujo (CFG) Control-Flow Graph G = 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
5 Identificando loops de estructuras recursivas Identificar aristas de retorno Encontrar los nodos y aristas en el loop dado por la arista de retorno Aparte de la arista de retorno –Aristas entrantes sólo al bloque básico con la cabeza de la arista de retorno –Una arista saliente del bloque básico a la cola de la arista de retorno ¿Cómo encontramos las aristas de retorno? bb1 bb2 bb4bb3 bb5 bb6
6 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
7 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 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
8 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 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
9 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 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
10 Computando Dominators bb1 bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 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
11 Computando Dominators bb1 bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 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
12 Computando Dominators bb1 bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 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
13 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 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
14 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 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
15 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 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
16 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 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
17 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 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
18 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 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
19 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 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
20 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
21 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
22 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
23 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
24 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
25 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb3 bb5 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
26 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb5 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
27 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb3 bb5 bb6 bb1 bb2 bb5 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
28 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
29 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
30 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
31 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
32 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
33 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
34 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
35 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
36 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
37 Computando Dominators bb2 bb4bb3 bb5 bb6 {bb1} bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb1 bb2 bb5 bb6 bb1 bb2 bb5 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
38 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
39 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
40 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
41 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
42 Ejemplo: Expresiones Disponibles a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f
43 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f Sí!
44 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f Sí!
45 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f No!
46 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f No!
47 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f No!
48 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f Sí!
49 ¿Está la expresión disponible? a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f Sí!
50 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f
51 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f
52 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = a + c j = a + b + c + d b = a + d h = c + f
53 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = f j = a + b + c + d b = a + d h = c + f
54 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = f j = a + b + c + d b = a + d h = c + f
55 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = f j = a + c + b + d b = a + d h = c + f
56 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = f j = f + b + d b = a + d h = c + f
57 Uso de Expresiones Disponibles a = b + c d = e + f f = a + c g = f j = f + b + d b = a + d h = c + f
58 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 5
59 Algoritmo para Expresiones Disponibles Asignar un número a cada expresión
60 b = a + d h = c + f g = a + c Ejemplo: Expresiones Disponibles a = b + c d = e + f f = a + c j = a + b + c + d
61 b = a + d h = c + f g = a + c Ejemplo: Expresiones Disponibles a = b + c d = e + f f = a + c j = a + b + c + d
62 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
63 Algoritmo para Expresiones Disponibles Asignar un número a cada expresión Calcular conjuntos gen y kill para cada expresión 15
64 Conjuntos Gen y Kill a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
65 Conjuntos Gen y Kill a = b + c 1 d = e + f 2 f = a + c 3 a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
66 a = b + c 1 gen = { b + c } kill = { cualquier expr con a } d = e + f 2 gen = { e + f } kill = { cualquier expr con d } f = a + c 3 gen = { a + c } kill = {cualquier expr con f } Conjuntos Gen y Kill a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
67 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 } Conjuntos Gen y Kill a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
68 Algoritmo para Expresiones 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 16
69 Conjuntos Gen y Kill agregados 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 } Propagar todos los conjuntos gen y kill desde el comienzo del bloque básico hasta el final del bloque básico
70 Conjunto Gen agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InGEN set OutGEN set OutGEN =
71 Conjunto Gen agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InGEN set OutGEN set El conjunto gen en la expresión actual debe estar en el conjunto OutGEN OutGEN = gen
72 Conjunto Gen agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InGEN set OutGEN set El conjunto gen en la expresión actual debe estar en el conjunto OutGEN Cualquier expresión en el conjunto InGEN que no está en el conjunto kill debe estar en el conjunto OutGEN OutGEN = gen (InGEN - kill)
73 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 }
74 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 }
75 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 }
76 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 }
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 = gen (InGEN - kill) 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 = { 2 } ({ 1 } - { 5,7 }) f = a + c 3 gen = { 3 } kill = { 2, 6 }
79 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 }
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 = gen (InGEN - kill)
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 = { 3 } ({ 1,2 } - { 2,6 })
82 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 }
83 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 } GEN = { 1, 3 }
84 Conjunto Kill agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InKILL set OutKILL set OutKILL =
85 Conjunto Kill agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InKILL set OutKILL set El conjunto kill de la expresión actual debe estar en el conjunto OutKILL OutKILL = kill
86 Conjunto Kill agregado a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } InKILL set OutKILL set El conjunto kill de la expresión actual debe estar en el conjunto OutKILL Cualquier conjunto en el InKILL debe estar en el OutKILL OutKILL = kill InKILL
87 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 }
88 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 }
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 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 }
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 = kill InKILL 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 = { 5,7 } { 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 } 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 }
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 = kill InKILL
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 = { 3,4,5,7 } { 2,6 }
96 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 }
97 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 } KILL = { 2, 3, 4, 5, 6, 7 }
98 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { }
99 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 20
100 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {1,2,3,4,5,6,7} OUT = {1,2,3,4,5,6,7}
101 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
102 Propagar conjunto de disponibles gen = { … } kill = {... } IN set OUT set OUT =
103 Propagar conjunto de disponibles gen = { … } kill = {... } IN set OUT set Si la expresión es generada (en el conjunto gen) entonces está disponible al final –Debe estar en el conjunto OUT OUT = gen
104 Propagar conjunto de disponibles gen = { … } kill = {... } IN set OUT set Si la expresión es generada (en el conjunto gen) entonces está disponible al final –Debe estar en el conjunto OUT Cualquier expresión disponible en la entrada (en el conjunto IN) y que no está en el conjunto kill debe estar disponible al final OUT = gen (IN - kill)
105 Propagar conjunto de disponibles IN set OUT = gen (IN - kill) OUT set IN =
106 Propagar conjunto de disponibles IN set La expresión está disponible sólo está disponible en todos los caminos de entrada OUT = gen (IN - kill) OUT set IN = OUT
107 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {1,2,3,4,5,6,7} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT
108 Conjuntos Gen y Kill agregados g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {1,2,3,4,5,6,7} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3
109 Conjuntos Gen y Kill agregados g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,2,3,4,5,6,7} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3
110 Conjuntos Gen y Kill agregados g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,2,3,4,5,6,7} OUT = {1,3} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3
111 Conjuntos Gen y Kill agregados j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,2,3,4,5,6,7} OUT = {1,3} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT g = a + c 4 a = b + c 1 d = e + f 2 f = a + c 3
112 Conjuntos Gen y Kill agregados j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} OUT = {1,3} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT g = a + c 4 a = b + c 1 d = e + f 2 f = a + c 3
113 Conjuntos Gen y Kill agregados j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT g = a + c 4 a = b + c 1 d = e + f 2 f = a + c 3
114 Conjuntos Gen y Kill agregados b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
115 Conjuntos Gen y Kill agregados b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
116 Conjuntos Gen y Kill agregados b = a + d 5 h = c + f 6 Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
117 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,2,3,4,5,6,7} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
118 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {1,2,3,4,5,6,7} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
119 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
120 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
121 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3
122 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT j = a + b + c + d 7 b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4
123 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {1,3,4} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
124 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {1,3,4,7} OUT = gen (IN - kill) IN = OUT b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
125 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7
126 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
127 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
128 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
129 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 a = b + c 1 d = e + f 2 f = a + c 3
130 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 j = a + b + c + d 7 b = a + d 5 h = c + f 6 g = a + c 4
131 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 b = a + d 5 h = c + f 6 j = a + b + c + d 7
132 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
133 Conjuntos Gen y Kill agregados Gen = { 1, 3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5, 6 } Kill = { 1, 7 } Gen = { 7 } Kill = { } IN = {} IN = {1,3} IN = {3} OUT = {1,3} OUT = {1,3,4} OUT = {3,5,6} OUT = {3,7} OUT = gen (IN - kill) IN = OUT a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6
134 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 en cada bloque básico con todas las expresiones Iterativamente propagar expresiones disponibles sobre el CFG Propagar dentro del bloque básico 28
135 Propagar dentro del bloque básico a = b + c 1 gen = { 1 } kill = { 3, 4, 5, 7 } IN set OUT set Comenzar con el conjunto IN de expresiones disponibles Linealmente propagar hacia abajo del bloque básico –Igual que el paso de data-flow –Una sola pasada ya que no hay aristas de retorno OUT = gen (IN - kill)
136 ae = { 1, 3 } g = a + c 4 ae = { 1, 3, 4 } 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 } j = a + b + c + d 7 ae = { 3, 7 } ae = { 3 } b = a + d 5 ae = { 3, 5 } h = c + f 6 ae = { 3, 5, 6 }
137 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 5
138 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
139 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)
140 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1,3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5,6 } Kill = { 1,7 } Gen = { 7 } Kill = { }
141 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = { 1,3} Kill = { 2,3,4,5,6,7 } Gen = { 4 } Kill = { } Gen = { 5,6 } Kill = { 1,7 } Gen = { 7 } Kill = { } Se requieren 7 bits por conjunto
142 Conjuntos Gen y Kill agregados a = b + c 1 d = e + f 2 f = a + c 3 g = a + c 4 j = a + b + c + d 7 b = a + d 5 h = c + f 6 Gen = Kill = Gen = Kill = Gen = Kill = Gen = Kill = Se requieren 7 bits por conjunto
143 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 5
144 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
145 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
146 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] ( )
147 Lattice Ejemplo: el lattice para el problema de “reaching definition” cuando sólo hay 3 definiciones { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 }
148 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
149 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d2, d3 } = ???
150 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d2, d3 } = ???
151 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d2, d3 } = ???
152 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d2, d3 } = { d2 }
153 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d3 } = ???
154 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d3 } = ???
155 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d3 } = ???
156 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d3 } = ???
157 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 } { d3 } = { d1, d2, d3 }
158 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
159 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
160 Orden Parcial Definimos a b sí y sólo sí a b = b Propiedades –a b existe un camino desde b hasta a { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 }
161 Alto del Lattice El alto del lattice es la cadena ascendiente más larga en el lattice –( T, a, b, c, …, )
162 Alto del Lattice El alto del lattice es la cadena ascendiente más larga en el lattice –( T, a, b, c, …, ) –Alto es ( T, {d2,d3}, {d3}, ) = 4 { d1, d2 } { d2, d3 } { d1 } { d3 } = { } T = { d1, d2, d3 } { d1, d3 } { d2 }
163 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
164 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
165 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 5
166 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
167 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 = { b 0 …b n | b k = 1 ssi la k-ésima definición} –kill = { b 0 …b n | b k = 1 ssi k-ésima variable es redefinida } –OUT = gen (IN - kill) –IN = OUT
168 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 = { b 0 …b n | b k = 1 } –kill = { b 0 …b n | b k = 1 } –OUT = –IN =
169 Ejemplo DU entry k = false i = 1 j = 2 j = j * 2 k = true i = i + 1 print ji = i + 1 k exit i < n
170 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n
171 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 }
172 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { } IN = { } OUT = IN = { } OUT = { } IN = { }
173 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { } IN = { } OUT = IN = { } OUT = { } IN = { }
174 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { } IN = { } OUT = IN = { } OUT = { } IN = { }
175 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { } OUT = IN = { } OUT = { } IN = { }
176 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = { } IN = { }
177 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = { } IN = { }
178 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = IN = { } OUT = { } IN = { }
179 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = IN = { } OUT = { } IN = { }
180 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = IN = { } OUT = { 4, 5, 6 } OUT = { } IN = { }
181 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = IN = { } OUT = { 4, 5, 6 } OUT = { } IN = { }
182 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { } IN = { }
183 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { } IN = { }
184 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { } IN = { }
185 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { } IN = { }
186 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { }
187 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
188 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
189 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
190 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
191 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
192 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
193 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
194 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { 1, 2, 3 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
195 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
196 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
197 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
198 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 7 } IN = { 1, 2, 3, 7 }
199 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 7 }
200 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
201 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
202 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
203 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
204 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
205 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
206 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
207 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
208 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n gen ={ 1, 2, 3 } kill = { 4,5,6,7 } gen ={ 4,5,6 } kill = { 1,2,3,7 } gen ={ } kill = { } gen ={ } kill = { } gen ={ } kill = { } gen ={ 7 } kill = { 2,6 } OUT = { 1, 2, 3 } IN = { 1, 2, 3, 4, 5, 6 } OUT = IN = { } OUT = IN = { 1, 2, 3, 4, 5, 6 } OUT = { 4, 5, 6 } OUT = { 1, 2, 3, 4, 5, 6 } OUT = { 1, 3, 4, 5, 7 } IN = { 1, 2, 3, 4, 5, 6, 7 }
209 Ejemplo DU entry k = false 1 i = 1 2 j = 2 3 j = j * 2 4 k = true 5 i = i print ji = i k exit i < n IN = { 1, 2, 3, 4, 5, 6 } IN = { } IN = { 1, 2, 3, 4, 5, 6 } IN = { 1, 2, 3, 4, 5, 6, 7 } IN = { 1, 2, 3, 4, 5, 6 }
210 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
211 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 5
212 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
213 Forma Static Single Assignment (SSA) a = 1 b = a + 2 c = a + b a = a + 1 d = a + b
214 Forma Static Single Assignment (SSA) a = 1 b = a + 2 c = a + b a = a + 1 d = a + b a 1 = 1 b 1 = a c 1 = a 1 + b 1 a 2 = a d 1 = a 2 + b 1
215 Forma Static Single Assignment (SSA) a = 1 c = a + 2 b = 1 c = b + 2 d = a + b + c
216 Forma Static Single Assignment (SSA) a = 1 c = a + 2 b = 1 c = b + 2 d = a + b + c a 1 = 1 c 1 = a b 1 = 1 c 2 = b c 3 = (c 1, c 2 ) d 1 = c 3 + 2
217 Ejemplo DU entry k = false i = 1 j = 2 j = j * 2 k = true i = i + 1 print ji = i + 1 k exit i < n
218 Ejemplo DU entry k 1 = false i 1 = 1 j 1 = 2 j 2 = j 3 * 2 k 2 = true i 2 = i print j 3 i 4 = i k 3 i 5 = (i 3, i 4 ) exit i 3 = (i 1, i 2 ) j 3 = (j 1, j 2 ) k 3 = (k 1, k 2 ) i 1 < n
219 Lecturas Ballena –Capítulo 12 Tigre – , 19.1, 19.2