Download , - Oscar Bonilla
Document related concepts
no text concepts found
Transcript
Compiladores Optimizaciones Tradicionales Simplificación Algebraica, Copy Propagation, y Constant Propagation 40 Resumen • • • • Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 2 Expresiones Disponibles • Dominio – conjunto de expresiones • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN - kill) – gen = { a | a se calcula en el bloque básico } – kill = { a | una variable va que es definida en el b.b. } • Operación Meet – IN = OUT • Valores iniciales conjunto entero (Top) 3 Cadena DU (Reaching Definitions) • Dominio – conjunto de definiciones • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN - kill) – gen = { x | x es definida en el statement} – kill = { x | LHS var. de x es redefinido en el statement. } • Operación Meet – IN = OUT • Valores iniciales Conjunto vacío (Bottom) 4 Framework para análisis • Análisis de control de flujo – Identificar la estructura del programa – Ayuda a construir el análisis de flujo de datos • Análisis de flujo de datos – Framework para encontrar la información necesaria para optimizar – Hasta ahora hemos encontrado • expresiones disponibles • cadenas UD y DU – ¡Ahora usemos esta información para hacer algo interesante! 5 Optimizaciones • Cada optimización es muy simple – Reduce la complejidad • Se necesitan múltiples optimizaciones • Es posible que haya que aplicar la misma optimización múltiples veces 6 40 Resumen • • • • Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 7 Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones 8 Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo – – – – – – – a+0 a*1 a/1 a*0 0-a a + (-b) -(-a) a a a 0 -a a-b a 9 Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo – – – – a a a a true false true false a false true a 10 Simplificación algebraica • Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones • Ejemplo –a^2 –a*2 –a*8 a*a a+a a << 3 11 Oportunidades para Simplificación Algebraica • En el código – Los programadores no simplifican expresiones – Los programas son más legibles con exresiones completas • Luego de la expansión del compilador – Ejemplo: Lectura de array A[8][12] va a ser expandida a: – *(Abase + 4*(12 + 8*256)) que puede ser simplificada después de otras optimizaciones 12 Utilidad de Simplificación Algebraica • Reduce el número de instrucciones • Usa expresiones menos “caras” • Habilita otras optimizaciones 13 Implementación • ¡No es una optimización de flujo de datos! • Encontrar candidatos que hagan match con las reglas de simplificación y simplificar los árboles de expresión • Los candidatos pueden no ser obvios 14 Implementación • ¡No es una optimización de flujo de datos! • Encontrar candidatos que hagan match con las reglas de simplificación y simplificar los árboles de expresión • Los candidatos pueden no ser obvios – Ejemplo a+b-a + - a b 15 a Usar nuestro conocimiento de los operadores • Operadores conmutativos – a op b = b op a • Operadores asociativos – (a op b) op c = b op (a op c) 16 Forma Canónica • Poner los árboles de expresiones en forma canónica – Suma de multiplicandos – Ejemplo • (a + 3) * (a + 8) * 4 4*a*a + 44*a + 96 – La Sección 12.3.1 de la ballena habla de esto 17 Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos 18 Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo – (a / b)*0 + c 19 Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo – (a / b)*0 + c – Podemos simplificar esto a c 20 Efectos en la estabilidad numérica • Algunas simplificaciones algebraicas pueden producir resultados incorrectos • Ejemplo – (a / b)*0 + c – Podemos simplificar esto a c – Pero qué pasa cuándo b = 0 debería ser una excepción, pero vamos a obtener un resultado 21 40 Resumen • • • • Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 22 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a d d + 2*e + c 23 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a d d + 2*e + c 24 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a d + 2*e + c 25 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a d + 2*e + c 26 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a a + 2*e + c 27 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a a + 2*e + c 28 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a a + 2*a + c 29 Copy Propagation • Eliminar copias múltiples – propagar el valor directamente a su uso • Ejemplo a d e f = = = = b + c a a a + 2*a + c 30 Oportunidades para Copy Propagation • En código del usuario • Después de otras optimizaciones – Ejemplo: Simplificación algebraica 31 Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas 32 Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a d e f = = = = b + c a a a + 2*a + c 33 Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a d e f = = = = b + c a a a + 2*a + c 34 Ventajas de Copy Propagation • Lleva a más simplificaciones algebraicas • Ejemplo a d e f = = = = b + c a a 3*a + c 35 Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia – Crea código muerto que puede ser eliminado 36 Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia – Crea código muerto que puede ser eliminado • Ejemplo a d e f = = = = b + c a a 3*a + c 37 Ventajas de Copy Propagation • Reduce instrucciones al eliminar ops de copia – Crea código muerto que puede ser eliminado • Ejemplo a = b + c f = 3*a + c 38 Cómo hacer copy propagation • Para cada expresión RHS Para cada variable v usada en expresión RHS – si la variable v es definida por un statement v = u – reemplazar la variable v por u • En cada punto del programa hay que saber – qué variables son iguales – un elemento <u,v> está en el conjunto ssi v = u (u, v son variables) 39 Cómo hacer copy propagation • Una asignación v = u todavía es válida en un punto dado de ejecución ssi – Un statement v = u occurre en cada camino de ejecución que llega al punto actual – La variable v no es redefinida en ninguno de estos caminos de ejecución entre el statement y el punto actual – La variable u no es redefinida en ninguno de caminos de ejecución entre el statement y el punto actual • ¡un problema de flujo de datos! 40 Problema de Data-Flow para Copy Propagation • Dominio – Conjunto de tuplas <v,u> representando un statement v = u • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN - kill) – gen = { <v,u> | v = u es el statement } – kill = { <v,u> | LHS var. del stmt. es v ó u } • Operación Meet – IN = OUT • Valores Iniciales Conjunto vacio (Bottom) 41 Ejemplo b=a c=b+1 d=b b=d+c b=d 42 gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } b=a c=b+1 d=b b=d+c b=d 43 gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } b=a c=b+1 d=b b=d+c b=d gen = { <b,a> } gen = { } gen = { <d,b> } gen = { } gen = { <b,d> } 44 gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } b=a gen = { <b,a> } kill = { <d,b>, <b,d> } gen = { } c = b + 1 kill = { } d=b gen = { <d,b> } kill = { <b,d> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 45 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } gen = { } c = b + 1 kill = { } d=b gen = { <d,b> } kill = { <b,d> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 46 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { } OUT = { <b,a> } gen = { } c = b + 1 kill = { } d=b gen = { <d,b> } kill = { <b,d> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 47 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } OUT = { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 48 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } OUT = { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 49 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } IN = { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } OUT = { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 50 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } IN = { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } IN = { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 51 OUT = { <b,d> } OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 52 { <b,d> } Ejemplo b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=b gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 53 { <b,d> } Ejemplo b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 54 { <b,d> } Ejemplo b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = d + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 55 { <b,d> } Ejemplo b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = b + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 56 { <b,d> } Ejemplo b=a gen = { <b,a> } kill = { <d,b>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,b> } kill = { <b,d> } { <b,a>, <d,b> } gen = { } b = b + c kill = { <b,a> <d,b>, <b,d> } { } b=d gen = { <b,d> } kill = { <b,a>, <d,b> } 57 { <b,d> } Ejemplo b=a c=b+1 d=a b=b+c b=d 58 gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } b=a c=b+1 d=a b=b+c b=d gen = { <b,a> } gen = { } gen = { <d,a> } gen = { } gen = { <b,d> } 59 gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } b=a gen = { <b,a> } kill = { <d,a>, <b,d> } gen = { } c = b + 1 kill = { } d=a gen = { <d,a> } kill = { <b,d> } gen = { } b = b + c kill = { <b,a>, <b,d> } b=d gen = { <b,d> } kill = { <b,a> } 60 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,a>, <b,d> } IN = { } OUT = { <b,a> } gen = { } c = b + 1 kill = { } d=a gen = { <d,a> } kill = { <b,d> } gen = { } b = b + c kill = { <b,a>, <b,d> } b=d gen = { <b,d> } kill = { <b,a> } 61 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,a>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } OUT = { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } gen = { } b = b + c kill = { <b,a>, <b,d> } b=d gen = { <b,d> } kill = { <b,a> } 62 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,a>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } OUT = { <b,a>, <d,a> } gen = { } b = b + c kill = { <b,a>, <b,d> } b=d gen = { <b,d> } kill = { <b,a> } 63 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,a>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } IN = { <b,a>, <d,a> } gen = { } b = b + c kill = { <b,a>, <b,d> } OUT = { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } 64 OUT = gen (IN - kill) b=a gen = { <b,a> } kill = { <d,a>, <b,d> } IN = { } IN = { <b,a> } gen = { } c = b + 1 kill = { } IN = { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } IN = { <b,a>, <d,a> } gen = { } b = b + c kill = { <b,a>, <b,d> } IN = { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } OUT = {<d,a> ,<b,d> } 65 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = b + c kill = { <b,a>, <b,d> } { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 66 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = b + c kill = { <b,a>, <b,d> } { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 67 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = a + c kill = { <b,a>, <b,d> } { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 68 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = a + c kill = { <b,a>, <b,d> } { <d,a> } b=d gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 69 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = a + c kill = { <b,a>, <b,d> } { <d,a> } b=a gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 70 Ejemplo b=a gen = { <b,a> } kill = { <d,a>, <b,d> } { } { <b,a> } gen = { } c = b + 1 kill = { } { <b,a> } d=a gen = { <d,a> } kill = { <b,d> } { <b,a>, <d,a> } gen = { } b = a + c kill = { <b,a>, <b,d> } { <d,a> } b=a gen = { <b,d> } kill = { <b,a> } {<d,a> ,<b,d> } 71 Ejemplo b=a c=b+1 d=a b=a+c b=a 72 Otro Ejemplo a=b+c p=q+r d=a s=p d=a a=d+p 73 Otro Ejemplo gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } a=b+c p=q+r Gen = {<d,a>, <s,p> } d=a s=p Gen = { } d=a Gen = {<d,a> } Gen = { } a=d+p 74 Otro Ejemplo gen = { <v,u> | v = u es el statement } kill = { <v,u> | LHS var. del stmt. es v ó u } a=b+c p=q+r Gen = {<d,a>, <s,p> } Kill = { } d=a s=p Gen = { } Kill = {<d,a>, <s,p> } d=a Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 75 Otro Ejemplo IN = OUT OUT = gen (IN - kill) Gen = {<d,a>, <s,p> } Kill = { } a=b+c p=q+r d=a s=p Gen = { } Kill = {<d,a>, <s,p> } d=a Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 76 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = {<d,a>, <s,p> } Kill = { } d=a s=p Gen = { } Kill = {<d,a>, <s,p> } d=a Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 77 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = {<d,a>, <s,p> } Kill = { } d=a s=p Gen = { } Kill = {<d,a>, <s,p> } d=a Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 78 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } Gen = {<d,a>, <s,p> } Kill = { } d=a s=p d=a Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 79 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } d=a s=p Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 80 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } d=a s=p Gen = {<d,a> } Kill = { } Gen = { } Kill = {{<d,a> } a=d+p 81 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } d=a s=p Gen = {<d,a> } Kill = { } OUT = { <d,a>, <s,p> } Gen = { } Kill = {{<d,a> } a=d+p 82 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } d=a s=p Gen = {<d,a> } Kill = { } OUT = { <d,a>, <s,p> } Gen = { } Kill = {{<d,a> } a=d+p 83 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } d=a s=p Gen = {<d,a> } Kill = { } OUT = { <d,a>, <s,p> } Gen = { } Kill = {{<d,a> } a=d+p 84 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } Gen = {<d,a> } Kill = { } d=a s=p OUT = { <d,a>, <s,p> } OUT = { <d,a> } Gen = { } Kill = {{<d,a> } a=d+p 85 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } Gen = {<d,a> } Kill = { } d=a s=p OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } Gen = { } Kill = {{<d,a> } a=d+p 86 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } Gen = {<d,a> } Kill = { } d=a s=p OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } Gen = { } Kill = {{<d,a> } a=d+p 87 Otro Ejemplo IN = OUT IN = { } OUT = gen (IN - kill) a=b+c p=q+r Gen = { } Kill = {<d,a>, <s,p> } OUT = { } IN = { } Gen = {<d,a>, <s,p> } d = a Kill = { } IN = { } Gen = {<d,a> } Kill = { } d=a s=p OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } Gen = { } Kill = {{<d,a> } a=d+p OUT = { } 88 Otro Ejemplo IN = { } a=b+c p=q+r OUT = { } IN = { } IN = { } d=a s=p d=a OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } a=d+p OUT = { } 89 Otro Ejemplo IN = { } a=b+c p=q+r OUT = { } IN = { } IN = { } d=a s=p d=a OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } a=d+p OUT = { } 90 Otro Ejemplo IN = { } a=b+c p=q+r OUT = { } IN = { } IN = { } d=a s=p d=a OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } a=a+p OUT = { } 91 Otro Ejemplo IN = { } a=b+c p=q+r OUT = { } IN = { } IN = { } d=a s=p d=a OUT = { <d,a>, <s,p> } OUT = { <d,a> } IN = { <d,a> } a=a+p OUT = { } 92 Otro Ejemplo a=b+c p=q+r d=a s=p d=a a=a+p 93 40 Resumen • • • • Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 94 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable 95 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable • Ejemplo a = 43 b = 4 d = a + 2*b + c 96 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable • Ejemplo a = 43 b = 4 d = a + 2*b + c 97 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable • Ejemplo a = 43 b = 4 d = 43 + 2*b + c 98 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable • Ejemplo a = 43 b = 4 d = a + 2*b + c 99 Constant Propagation • Usar valores constantes – Usar la constante conocida para una variable • Ejemplo a = 43 b = 4 d = 43 + 2*4 + c 100 Oportunidades para Constant Propagation • Constantes definidas por el usuario – Las mismas constantes se propagan por muchos caminos – Constantes simbólicas definidas como variables • Constantes conocidas al compilador – data sizes, stack offsets • Constantes disponibles después de otras optimizaciones – Simplificación algebraica – Copy propagation 101 Ventajas de Constant Propagation • Simplificación del programa 102 Ventajas de Constant Propagation • Simplificación del programa • Ejemplo a = 43 b = 4 d = 43 + 2*4 + c 103 Ventajas de Constant Propagation • Simplificación del programa • Ejemplo a = 43 b = 4 d = 43 + 2*4 + c 104 Ventajas de Constant Propagation • Simplificación del programa • Ejemplo a = 43 b = 4 d = 51 + c 105 Ventajas de Constant Propagation • Habilita otras optimizaciones 106 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*a - b + c c + d 107 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*a - b + c c + d 108 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*4 - b + c c + d 109 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*4 - b + c c + d 110 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*4 - 8 + c c + d 111 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 2*4 - 8 + c c + d 112 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 8 - 8 + c c + d 113 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 8 - 8 + c c + d 114 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 0 + c c + d 115 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 0 + c c + d 116 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + d 117 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + d 118 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + d 119 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + c 120 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + c 121 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c c + c 122 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c 2*c 123 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a b d e = = = = 4 8 c 2*c 124 Ventajas de Constant Propagation • Habilita otras optimizaciones • Ejemplo a = 4 b = 8 e = 2*c 125 Cómo hacer Constant Propagation • En cada expresión RHS Para cada variable v usada en expresión RHS – si la variable v es una constante conocida k – reemplazar la variable v por k • En cada punto del programa hay que saber – Para cada variable v, si v es una constante, y si lo es, el valor constante 126 Cómo hacer Constant Propagation • Una variable v es la constante k en un punto de ejecución ssi – el statement actual es v = k o – todo camino que llega al punto actual tiene la constante k asignada a v • ¡Un problema de flujo de datos! 127 Valores de dos caminos a=5 a=5 b = a + 10 128 Valores de dos caminos a=5 a=k+2 b = a + 10 129 Valores de dos caminos a=5 a=7 b = a + 10 130 Valores de dos caminos a=5 a no definida b = a + 10 131 Valores de dos caminos a=5 a no definida b = a + 10 • programa tonto, usa un valor no inicializado 132 Valores de dos caminos a=5 a no definida b = a + 10 • programa tonto, usa un valor no inicializado • semántica de alto nivel que el compilador no entiende hace que este sea un programa correcto 133 Lattice para Constant Propagation T = undefined false true …. -2 -1 0 1 = not a constant 134 2 3 4 …. Lattice (repaso) • Un lattice L consiste de – un conjunto de valores – dos operaciones meet( ) y join ( ) – un valor top (T) y un valor bottom () 135 Lattice (repaso) • Ejemplo: el lattice para el problema de reaching definitions cuándo sólo hay 3 definiciones T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 136 { d3 } Operaciones Meet y Join { d1, d2 } { d2, d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 137 { d3 } Operaciones Meet y Join { d1, d2 } { d2, d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 138 { d3 } Operaciones Meet y Join { d1, d2 } { d2, d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 139 { d3 } Operaciones Meet y Join { d1, d2 } { d2, d3 } = { d2 } T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 140 { d3 } Operaciones Meet y Join { d1, d2 } { d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 141 { d3 } Operaciones Meet y Join { d1, d2 } { d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 142 { d3 } Operaciones Meet y Join { d1, d2 } { d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 143 { d3 } Operaciones Meet y Join { d1, d2 } { d3 } = ??? T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 144 { d3 } Operaciones Meet y Join { d1, d2 } { d3 } = { d1, d2, d3 } T = { d1, d2, d3 } { d2, d3 } { d1, d2 } { d1, d3 } { d2 } { d1 } ={ } 145 { d3 } Lattice para Constant Propagation T = undefined false true …. -2 -1 0 1 = not a constant 146 2 3 4 …. Operación Meet en el lattice a=2 a=2 2 2 = T = undefined =a false true …. -2 -1 0 1 = not a constant 147 2 3 4 …. Operación Meet en el lattice a=2 a=2 2 2 = T = undefined =a false true …. -2 -1 0 1 = not a constant 148 2 3 4 …. Operación Meet en el lattice a=2 a=2 2 2 =2 T = undefined =a false true …. -2 -1 0 1 = not a constant 149 2 3 4 …. Operación Meet en el lattice a=2 a=0 2 0 = T = undefined =a false true …. -2 -1 0 1 = not a constant 150 2 3 4 …. Operación Meet en el lattice a=2 a=0 2 0 = T = undefined =a false true …. -2 -1 0 1 = not a constant 151 2 3 4 …. Operación Meet en el lattice a=2 a=0 2 0 = T = undefined =a false true …. -2 -1 0 1 = not a constant 152 2 3 4 …. Operación Meet en el lattice a=2 a=0 2 0 = not a constant T = undefined =a false true …. -2 -1 0 1 = not a constant 153 2 3 4 …. Operación Meet en el lattice a=2 undefined 2 undefined = T = undefined =a false true …. -2 -1 0 1 = not a constant 154 2 3 4 …. Operación Meet en el lattice a=2 undefined 2 undefined = T = undefined =a false true …. -2 -1 0 1 = not a constant 155 2 3 4 …. Operación Meet en el lattice a=2 undefined 2 undefined = T = undefined =a false true …. -2 -1 0 1 = not a constant 156 2 3 4 …. Operación Meet en el lattice a=2 undefined 2 undefined = 2 T = undefined =a false true …. -2 -1 0 1 = not a constant 157 2 3 4 …. Problema de Data-Flow para Constant Propagation • Dominio – Para cada variable un lattice Lv • Dirección de flujo de datos • Función de flujo de datos – OUT = gen (IN resv) 158 Hacia adelante Problema de Data-Flow para Constant Propagation • Dominio – Para cada variable un lattice Lv • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN resv) T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante de otra forma 159 Problema de Data-Flow para Constant Propagation • Dominio – Para cada variable un lattice Lv • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN resv) T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante de otra forma T – prsv = xv xv = si v es el LHS si v no es el LHS 160 Problema de Data-Flow para Constant Propagation • Dominio – Para cada variable un lattice Lv • Dirección de flujo de datos • Función de flujo de datos Hacia adelante – OUT = gen (IN resv) T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante de otra forma T – prsv = xv xv = • Valores Iniciales si v es el LHS si v no es el LHS T (= undefined) 161 i=1 j=2 k = false i<n k i=3 j=2 print j j=j+1 exit 162 i=1 j=2 k = false 163 • T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 164 gen ={ • i:T, j:T, T k:T, n:T } si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 165 gen ={ • i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 166 i=1 gen ={ • i:1, j:T, k:T, n:T } prsv = { i:T, j:, k:, n: } T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 167 i=1 j=2 gen ={ • i:1, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 168 i=1 j=2 k = false gen ={ • i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } T si v no es LHS – gen = xv xv = valor si v es LHS & RHS es constante. de otra forma T si v es el LHS – prsv = xv xv = si v no es el LHS 169 i=1 j=2 k = false gen ={ i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i<n k i=3 j=2 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 170 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=1 j=2 k = false gen ={ i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i<n k i=3 j=2 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 171 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i<n k i=3 j=2 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 172 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=1 j=2 k = false gen = { i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } IN = j:T, k:T, n:T } { i:T, 173 T = undefined i=1 false j=2 k = false true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } IN = j:T, k:T, n:T } { i:T, OUT = gen (IN resv) 174 T = undefined i=1 false j=2 k = false true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:1, j:2, k:false, n:T } prsv = { i:T, j:T, k:T, n: } IN = j:T, k:T, n:T } k:false, n:T } { i:T, OUT = gen (IN resv) IN = { i:1, j:2, 175 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i<n k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 176 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i<n k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 177 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T = undefined false i<n out1 = { i:T, out2 = { i:1, IN = out1 out2 true …. -2 -1 0 1 2 3 4 …. = not a constant j:T, j:2, 178 k:T, k:false, n:T } n:T } T = undefined false i<n out1 = { i:T, out2 = { i:1, IN = out1 out2 IN = { i:1, true …. -2 -1 0 1 2 3 4 …. = not a constant j:T, j:2, k:T, k:false, n:T } n:T } j:2, k:false, n:T } 179 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 180 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:1, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 181 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:1, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 182 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:1, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={ i:T, j:T, k:T, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } j=j+1 exit 183 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T = undefined i=3 false j=2 true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } IN = j:2, k:false, n:T } { i:1, OUT = gen (IN resv) 184 T = undefined i=3 false j=2 true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } IN = j:2, k:false, n:T } k:false, n:T } { i:1, OUT = gen (IN resv) IN = { i:3, j:2, 185 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:1, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } j=j+1 exit 186 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:1, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } j=j+1 exit 187 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T = undefined false i<n out1 = { i:1, out2 = { i:3, IN = out1 out2 true …. -2 -1 0 1 2 3 4 …. = not a constant j:2, j:2, 188 k:false, k:false, n:T } n:T } T = undefined false i<n out1 = { i:1, out2 = { i:3, IN = out1 out2 IN = { i:, true …. -2 -1 0 1 2 3 4 …. = not a constant j:2, j:2, k:false, k:false, n:T } n:T } j:2, k:false, n:T } 189 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } j=j+1 exit 190 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } j=j+1 exit 191 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 192 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 193 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 exit 194 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:2, k:false, n:T } exit 195 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:2, k:false, n:T } exit 196 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:2, k:false, n:T } exit 197 gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T = undefined j=j+1 false true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:T, j:, k:T, n:T } prsv = { i:, j:T, k:, n: } IN = { i:, j:2, k:false, n:T } OUT = gen (IN resv) 198 T = undefined j=j+1 false true …. -2 -1 0 1 2 3 4 …. = not a constant gen = { i:T, j:, k:T, n:T } prsv = { i:, j:T, k:, n: } IN = { i:, j:2, k:false, n:T } k:false, n:T } OUT = gen (IN resv) IN = { i:, j:, 199 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 OUT ={i:, j:2, k:false, n:T } exit 200 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 OUT ={i:, j:2, k:false, n:T } exit 201 gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } T = undefined false exit out1 = { i:, out2 = { i:, IN = out1 out2 IN = { i:, true …. -2 -1 0 1 2 3 4 …. = not a constant j:2, j:, k:false, k:false, n:T } n:T } j:, k:false, n:T } 202 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 OUT ={i:, j:2, k:false, n:T } gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:, k:false, n:T } OUT ={i:, j:, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } exit prsv = { i:, j:, k:, n: } 203 IN ={ i:T, j:T, k:T, n:T } i=1 gen ={ i:1, j:2, k:false, n:T } j=2 prsv = { i:T, j:T, k:T, n: } k = false OUT ={i:1, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } i<n prsv = { i:, j:, k:, n: } OUT ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } k gen ={ i:T, j:T, k:T, n:T } prsv = { i:, j:, k:, n: } IN ={i:1, j:2, k:false, n:T } OUT ={i:, j:2, k:false, n:T } i=3 gen ={ i:3, j:2, k:T, n:T } prsv = { i:T, j:T, k:, n: } j=2 OUT ={i:3, j:2, k:false, n:T }IN ={i:, j:2, k:false, n:T } IN ={i:, j:2, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } print j prsv = { i:, j:, k:, n: } j=j+1 OUT ={i:, j:2, k:false, n:T } gen ={ i:T, j:, k:T, n:T } prsv ={ i:, j:T, k:, n:} OUT ={i:, j:, k:false, n:T } OUT ={i:, j:, k:false, n:T } gen ={ i:T, j:T, k:T, n:T } exit prsv = { i:, j:, k:, n: } 204 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print j IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 205 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } k IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print j IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 206 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print j IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 207 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print j IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 208 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print 2 IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 209 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print 2 IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 210 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print 2 IN ={i:, j:2, k:false, n:T } j=j+1 OUT ={i:, j:, k:false, n:T } exit 211 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print 2 IN ={i:, j:2, k:false, n:T } j=2+1 OUT ={i:, j:, k:false, n:T } exit 212 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } false IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } print 2 IN ={i:, j:2, k:false, n:T } j=2+1 OUT ={i:, j:, k:false, n:T } exit 213 IN ={ i:T, j:T, k:T, n:T } i=1 j=2 k = false IN ={i:1, j:2, k:false, n:T } i<n IN ={i:, j:2, k:false, n:T } IN ={i:1, j:2, k:false, n:T } i=3 j=2 IN ={i:, j:2, k:false, n:T } j=2+1 OUT ={i:, j:, k:false, n:T } exit 214 Lecturas • Ballena – Capítulo 13 215