2.2k likes | 2.52k Views
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. Un grafo muy grande Crear Bloques Básicos
E N D
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
Un grafo muy grande • Crear Bloques Básicos • Un Grafo de Control de Flujo (CFG) conecta los Bloques Básicos Representando el control de flujo del progama • Forma un grafo
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
bb1 bb2 bb3 bb4 bb5 bb6 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?
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
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1}
bb1 bb2 bb3 bb4 bb5 bb6 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 {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
bb1 bb2 bb3 bb4 bb5 bb6 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 {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
bb1 bb2 bb3 bb4 bb5 bb6 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 {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
bb1 bb2 bb3 bb4 bb5 bb6 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 {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
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 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 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 {bb1} bb1 bb2 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 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb3 bb4 bb5 bb6 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb3 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb3 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6 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 {bb1} bb1 bb2 bb1 bb2 bb4 bb1 bb2 bb3 bb1 bb2 bb5 bb1 bb2 bb5 bb6
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
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
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
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
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d Ejemplo: Expresiones Disponibles
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? Sí!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? Sí!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? No!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? No!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? No!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? Sí!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d ¿Está la expresión disponible? Sí!
a = b + c d = e + f f = a + c b = a + d h = c + f g = a + c j = a + b + c + d Uso de Expresiones Disponibles