2do cuatrimestre de 2011 Análisis Automático de Programas Análisis Automático de Programas Práctica 2 – Análisis dataflow e interpretación abstracta Parte 1 – Análisis dataflow Ejercicio 1 Sea el siguiente programa, donde MASK, IQ, IR e IM son constantes. public f l o a t f o o ( int p i d ) { int i , j , h ; i = p i d ˆ MASK; int k = i / IQ ; h = IA ∗ ( i − k ∗ IQ ) − IR ∗ k ; h = j ˆ MASK; i f ( h<0) h = h + IM ; f l o a t answer = AM ∗ h ; return answer ∗ p i d / k ; } a) Construir su control flow graph. b) Computar el análisis de variables vivas. Ejercicio 2 Completar la siguiente tabla para el análisis de reaching definitions. Sentencia s t := b + c if a < b then goto L1 else goto L2 fi t := f (a, b, c gen(s) kill(s) Ejercicio 3 Computar para cada nodo n del CFG del siguiente programa, los conjuntos in(n) y out(n) del análisis de reaching definitions: a := c := L1: if c c := goto L2: a := c := 5 1 > a goto L2 c + c L1 c - a 0 ¿Qué definiciones de la variable a llegan a la instrucción etiquetada con L1? ¿Qué optimización podemos hacer con esta información? Ejercicio 4 Computar para cada nodo n del CFG del siguiente programa, los conjuntos in(n) y out(n) del análisis de avalilable expressions: Página 1 de 5 2do cuatrimestre de 2011 Análisis Automático de Programas a := 3 i := 0 L1: if i > a goto L2 t := M[i] M[i] := t i := i + 1 goto L1 L2: print(M, a) Ejercicio 5 Completar la siguiente tabla para el análisis de liveness. Sentencia s t := b + c if a < b then goto L1 else goto L2 fi t := f (a, b, c gen(s) kill(s) {t} Ejercicio 6 Computar para cada nodo n del CFG del siguiente programa, los conjuntos in(n) y out(n) del análisis de reaching expressions (very busy expressions): if a > b L1: x := b y := a goto L3 L2: y := b x := a L3: print(x, goto L1 else goto L2 a b a b y) Ejercicio 7 Categorizar los análisis dataflow usados. Forward Backwards May Must Parte 2 – Interpretación abstracta Ejercicio 8 Sea hS, vi un orden parcial. Probar que el supremo entre dos elementos es único. Ejercicio 9 Definir un reticulado usando el orden parcial hZ, ≤i. ¿Existen elementos > y ⊥? Página 2 de 5 2do cuatrimestre de 2011 Análisis Automático de Programas Ejercicio 10 S Definir un reticulado completo sobre el conjunto Z {−∞, ∞}. Ejercicio 11 Sean las siguientes funciones: 1. Calcular ϕ(tX) para todo X ⊆ S 2. Enumerar todas las cadenas incrementales (increasing chains) en S 3. ¿Es ϕ continua (monótona y upper continuos)? 4. Computar iterativamente el lfp (mı́nimo punto fijo) y el gfp (máximo punto fijo) de ϕ. Ejercicio 12 Definir una conexión de Galois para los siguientes pares de reticulados: Ejercicio 13 Sea Cγα A una conexión de Galois. Demostrar que γ es inyectiva si y sólo si α es suryectiva. Página 3 de 5 2do cuatrimestre de 2011 Análisis Automático de Programas Ejercicio 14 Mostrar una conexión de Galois Cγα A que cumpla que exista a ∈ A tal que αγ(a) 6= a Ejercicio 15 Supongamos que disponemos de un lenguaje imperativo donde los pares de enteros es un tipo primitivo. La suma entre 2 pares es la suma miembro a miembro mientras que la suma de un par con un entero es operar esa suma sobre cada componente. Sea el siguiente programa en este lenguaje. p1 := <-5,-5> p2 := <1,1> while (p1 != <0,0>) p1 := p1 + p2 p2 := p2 + 1 1. Definir una semántica concreta para este lenguaje usando el reticulado completo definido en el ejercicio 10. 2. Computar el mı́nimo punto fijo usando collecting semantics. 3. Si se desea conocer si ambos componentes del par son iguales, ¿qué reticulado utilizarı́a? 4. Establecer una conexión de Galois entre el reticulado del punto a) y el reticulado del punto c). Ejercicio 16 Sea el siguiente programa while (true) x := y +1 if (y=0) x := 0 1. Computar las igualdades de la forma x = y. Ayuda: usar el reticulado de conjuntos de pares de variables. 2. Computar el signo de todas las variables. Ejercicio 17 Sea el siguiente programa donde string es una cadena de caracteres en Σ = {a, . . . z}. La operación str1 ++ str2 es la concatenación entre str1 y str2, mientras que ^str es el primer caracter de la cadena. string = "a" while (true) string = string ++ "b" if ^string != "a" break Página 4 de 5 2do cuatrimestre de 2011 Análisis Automático de Programas 1. Definir una semántica concreta para el lenguaje que se utiliza en el programa. Utilizar un reS ticulado completo cuyo dominio es C = Σ∗ {z ω } (el conjunto de cadenas finitas sobre Σ y la cadena infinita zzz . . . ). Computar el mı́nimo punto fijo usando collecting semantics. 2. Se desea conocer si la sentencia break se puede ejecutar. Definir una semántica abstracta para este problema. Computar el mı́nimo punto fijo. 3. Definir una conexión de Galois entre ambas semánticas. Página 5 de 5