Compiladores Optimizaciones Tradicionales Simplificación Algebraica, Copy Propagation, y Constant Propagation.

Slides:



Advertisements
Presentaciones similares
Simplificación de expresiones algebraicas
Advertisements

Expresiones Racionales
Productos Notables.
ALGEBRA RELACIONAL Y CALCULO RELACIONAL CON REFERENCIA A BASE DE DATOS
MATEMÁTICAS 3.º ESO Unidad 3: Polinomios
Unidad 4. Estructuras de selección
Introducción a la Estadística Informática
Combinadores SK.
La función de transferencia de sistemas lineales
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERIA DIVISIÓN DE INGENIERÍA ELÉCTRICA COMPUTACIÓN PARA INGENIEROS NOTA IMPORTANTE: Para complementar.
Objetos de un programa Datos: Se denomina dato a toda aquella información característica de una entidad y que es susceptible de tratamiento en un programa.
EXPRESIONES RACIONALES
INTRODUCCIÓN AL ALGEBRA
Teoría de lenguajes y compiladores
EXPRESIONES FRACCIONARIAS Y RADICALES.
Expresiones algebraicas
DERIVADAS DE FUNCIONES ALGEBRAICAS Prof. Luis Martínez Catalán 2008
ESTRUCTURAS DE CONTROL
Asignación de Registros
Diseño de diagramación Diagrama: es una representación gráfica del flujo información de y el proceso de ejecución del programa. Plateo del problema en.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
Análisis y Diseño de Algoritmos. Propiedades : f ( n )  O ( f ( n ) ) a ) O ( f ( n ) )  O ( g ( n ) )  f ( n )  g ( n )
TEMA 4 TRANSFORMADA DE LAPLACE
Control de flujo: Bucles
M.S.C. Ivette Hernández Dávila
Tomando Decisiones.
Administración de Proyectos de desarrollo de Software Ciclo de vida de un proyecto Enfoque moderno Temas Componentes Directivas Declaraciones globales.
Tema-14. Las enzimas en el interior celular
Presentación introductoria
(false and (74 >= 34)) xor 45 < 78 ; El análisis semántico en CUP se hace de forma ascendente, por ello se parte del árbol completo para su explicación.
Tipos de Datos. Entrada-Salida.. La entrada-salida (I/O) le permite a un programa comunicarse con el mundo exterior. Esta comunicación puede realizarse.
Evaluación de Expresiones Algebraicas
Elementos básicos del lenguaje
ETAPAS PARA SOLUCIONAR UN PROBLEMA
Programación de Sistemas
1 Compilación de Pattern Matching Un ejemplo: zipWith f [] ys = [] zipWith f (x:xs) [] = [] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys Semántica.
Elementos básicos del lenguaje
1 Samba: Un lenguaje funcional perezoso Presentación del lenguaje: qué es un programa Samba definiciones locales abstracciones lambda Tipos inductivos:
OPERACIONES CON FRACCIONES ALGEBRAICAS
Ecuaciones de segundo grado en una variable
INFORMATICA VII (Programación e implementación de sistemas)
Elementos básicos para el desarrollo de algoritmos
Patricio A. Castillo José M. Galarce Agosto 23 de 2008 Segunda Clase.
Álgebra de conmutación
FUNCIONES PARA OPERAR CON EXPRESIONES ALGEBRAICAS
Repaso de algebra de octavo año
IDENTIDADES TRIGONOMÉTRICAS
Fracciones Algebraicas
Productos Notables.
Multiplicando términos con diferentes letras. Caso Simple La expresión.
PRINCIPIOS DE PROGRAMACIÓN
Expresiones algebraicas Expresiones Algebraicas Es toda combinación finita de números y letras sometidos un número finito de veces a las operaciones.
Números Complejos.
Teoría y manejo de Ecuaciones lineales.
OPERACIONES CON FRACCIONES ALGEBRAICAS
ALGEBRA.
7 Sesión Contenidos: Simplificación de fracciones algebraicas.
Actualizado agosto 2010 por Guiomar Mora de Reyes
Incluye las ecuaciones en los bloques que corresponden a las operaciones unitarias constitutivas del proceso. El aspecto del diagrama de bloques para el.
Compiladores Análisis de Flujo de Datos. 2 Resumen Overview de análisis de control de flujo Expresiones disponibles Algoritmo para calcular expresiones.
FUNDAMENTOS DE PROGRAMACIÓN
MULTIPLICACÓN DE RADICALES
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo Uso de Procedimiento y Funciones Conceptos básicos.
Suma, Resta, Multiplicación, y División de Números enteros
FRACCIONES ALGEBRAICAS
Programación de Sistemas
Kevin Rodríguez adelante 2015 algebra reddines y tecnología.
1 Números racionales El conjunto Q de los números racionales
Operaciones algebraicas
Sesión Contenidos: 5 ↘Operatoria con Fracciones Algebraicas. Profesor: Víctor Manuel Reyes Feest Asignatura: Matemática Básica (MAT-003) Primer Semestre.
Transcripción de la presentación:

Compiladores Optimizaciones Tradicionales Simplificación Algebraica, Copy Propagation, y Constant Propagation

2 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

3 Expresiones Disponibles Dominio –conjunto de expresiones Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN - kill) –gen = { a | a se calcula en el bloque básico } – kill = { a |  una variable v  a que es definida en el b.b. } Operación Meet –IN =  OUT Valores iniciales conjunto entero (Top)

4 Cadena DU (Reaching Definitions) Dominio –conjunto de definiciones Dirección de flujo de datosHacia adelante Función de flujo de datos –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 inicialesConjunto vacío (Bottom)

5 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!

6 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

7 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

8 Simplificación algebraica Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones

9 Simplificación algebraica Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones Ejemplo –a + 0  a –a * 1  a –a / 1  a –a * 0  0 –0 - a  -a –a + (-b)  a - b –-(-a)  a

10 Simplificación algebraica Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones Ejemplo –a  true  a –a  false  false –a  true  true –a  false  a

11 Simplificación algebraica Aplicar nuestro conocimiento de algebra, teoría de números, etc para simplificar expresiones Ejemplo –a ^ 2  a*a –a * 2  a + a –a * 8  a << 3

12 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

13 Utilidad de Simplificación Algebraica Reduce el número de instrucciones Usa expresiones menos “caras” Habilita otras optimizaciones

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

15 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 a +

16 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)

17 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 de la ballena habla de esto

18 Efectos en la estabilidad numérica Algunas simplificaciones algebraicas pueden producir resultados incorrectos

19 Efectos en la estabilidad numérica Algunas simplificaciones algebraicas pueden producir resultados incorrectos Ejemplo –(a / b)*0 + 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

21 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

22 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

23 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = d f = d + 2*e + c

24 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = d f = d + 2*e + c

25 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = d + 2*e + c

26 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = d + 2*e + c

27 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = a + 2*e + c

28 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = a + 2*e + c

29 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = a + 2*a + c

30 Copy Propagation Eliminar copias múltiples –propagar el valor directamente a su uso Ejemplo a = b + c d = a e = a f = a + 2*a + c

31 Oportunidades para Copy Propagation En código del usuario Después de otras optimizaciones –Ejemplo: Simplificación algebraica

32 Ventajas de Copy Propagation Lleva a más simplificaciones algebraicas

33 Ventajas de Copy Propagation Lleva a más simplificaciones algebraicas Ejemplo a = b + c d = a e = a f = a + 2*a + c

34 Ventajas de Copy Propagation Lleva a más simplificaciones algebraicas Ejemplo a = b + c d = a e = a f = a + 2*a + c

35 Ventajas de Copy Propagation Lleva a más simplificaciones algebraicas Ejemplo a = b + c d = a e = a f = 3*a + c

36 Ventajas de Copy Propagation Reduce instrucciones al eliminar ops de copia –Crea código muerto que puede ser eliminado

37 Ventajas de Copy Propagation Reduce instrucciones al eliminar ops de copia –Crea código muerto que puede ser eliminado Ejemplo a = b + c d = a e = a f = 3*a + c

38 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

39 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 está en el conjunto ssi v = u (u, v son variables)

40 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!

41 Problema de Data-Flow para Copy Propagation Dominio –Conjunto de tuplas representando un statement v = u Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN - kill) –gen = { | v = u es el statement } –kill = { | LHS var. del stmt. es v ó u } Operación Meet –IN =  OUT Valores InicialesConjunto vacio (Bottom)

42 Ejemplo b = a c = b + 1 d = b b = d + c b = d

43 b = a c = b + 1 d = b b = d + c b = d gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

44 b = a c = b + 1 d = b b = d + c b = d gen = { } gen = { } gen = { } gen = { } gen = { } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

45 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

46 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } OUT = gen  (IN - kill)

47 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } OUT = { } IN = { } OUT = gen  (IN - kill)

48 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } OUT = { } IN = { } OUT = gen  (IN - kill)

49 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } IN = { } OUT = {, } OUT = gen  (IN - kill)

50 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } IN = { } IN = {, } OUT = { } OUT = gen  (IN - kill)

51 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } IN = { } IN = {, } IN = { } OUT = { } OUT = gen  (IN - kill)

52 b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { } OUT = gen  (IN - kill)

53 Ejemplo b = a c = b + 1 d = b b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { }

54 Ejemplo b = a c = b + 1 d = a b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { }

55 Ejemplo b = a c = b + 1 d = a b = d + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { }

56 Ejemplo b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { }

57 Ejemplo b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = {, } { } {, } { }

58 Ejemplo b = a c = b + 1 d = a b = b + c b = d ¿Terminamos? ¡No!

59 b = a c = b + 1 d = a b = b + c b = d gen = { } gen = { } gen = { } gen = { } gen = { } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

60 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

61 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } OUT = { } IN = { } OUT = gen  (IN - kill)

62 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } OUT = { } IN = { } OUT = gen  (IN - kill)

63 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } IN = { } OUT = {, } OUT = gen  (IN - kill)

64 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } IN = { } IN = {, } OUT = { } OUT = gen  (IN - kill)

65 b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } IN = { } IN = {, } IN = { } OUT = {, } OUT = gen  (IN - kill)

66 Ejemplo b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

67 Ejemplo b = a c = b + 1 d = a b = b + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

68 Ejemplo b = a c = b + 1 d = a b = a + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

69 Ejemplo b = a c = b + 1 d = a b = a + c b = d gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

70 Ejemplo b = a c = b + 1 d = a b = a + c b = a gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

71 Ejemplo b = a c = b + 1 d = a b = a + c b = a gen = { } kill = {, } gen = { } kill = { } gen = { } kill = { } gen = { } kill = {, } gen = { } kill = { } { } {, } { } {, }

72 Ejemplo b = a c = b + 1 d = a b = a + c b = a ¿Terminamos? ¡Sí!

73 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a

74 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Gen = {, }Gen = { } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

75 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } gen = { | v = u es el statement } kill = { | LHS var. del stmt. es v ó u }

76 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } OUT = gen  (IN - kill) IN =  OUT

77 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT

78 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT

79 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { }

80 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { }

81 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { }

82 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, }

83 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, }

84 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, }

85 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, } OUT = { }

86 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

87 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

88 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a Gen = { } Kill = {, } Gen = {, } Kill = { } Gen = { } Kill = { } Gen = { } Kill = {{ } IN = { } OUT = gen  (IN - kill) IN =  OUT OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

89 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a IN = { } OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

90 Otro Ejemplo a = b + c p = q + r d = a s = p a = d + p d = a IN = { } OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

91 Otro Ejemplo a = b + c p = q + r d = a s = p a = a + p d = a IN = { } OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

92 Otro Ejemplo a = b + c p = q + r d = a s = p a = a + p d = a IN = { } OUT = { } IN = { } OUT = {, } OUT = { } IN = { }

93 Otro Ejemplo a = b + c p = q + r d = a s = p a = a + p d = a

94 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

95 Constant Propagation Usar valores constantes –Usar la constante conocida para una variable

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 = a + 2*b + c

98 Constant Propagation Usar valores constantes –Usar la constante conocida para una variable Ejemplo a = 43 b = 4 d = *b + c

99 Constant Propagation Usar valores constantes –Usar la constante conocida para una variable Ejemplo a = 43 b = 4 d = a + 2*b + c

100 Constant Propagation Usar valores constantes –Usar la constante conocida para una variable Ejemplo a = 43 b = 4 d = *4 + c

101 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

102 Ventajas de Constant Propagation Simplificación del programa

103 Ventajas de Constant Propagation Simplificación del programa Ejemplo a = 43 b = 4 d = *4 + c

104 Ventajas de Constant Propagation Simplificación del programa Ejemplo a = 43 b = 4 d = *4 + c

105 Ventajas de Constant Propagation Simplificación del programa Ejemplo a = 43 b = 4 d = 51 + c

106 Ventajas de Constant Propagation Habilita otras optimizaciones

107 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2*a - b + c e = c + d

108 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2*a - b + c e = c + d

109 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2*4 - b + c e = c + d

110 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2*4 - b + c e = c + d

111 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2* c e = c + d

112 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 2* c e = c + d

113 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + d

114 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + d

115 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 0 + c e = c + d

116 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = 0 + c e = c + d

117 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + d

118 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + d

119 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + d

120 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + c

121 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + c

122 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = c + c

123 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = 2*c

124 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 d = c e = 2*c

125 Ventajas de Constant Propagation Habilita otras optimizaciones Ejemplo a = 4 b = 8 e = 2*c

126 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

127 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!

128 Valores de dos caminos a = 5 b = a + 10 a = 5

129 Valores de dos caminos a = 5 b = a + 10 a = k + 2 a no es constante

130 Valores de dos caminos a = 5 b = a + 10 a = 7 a no es constante

131 Valores de dos caminos a = 5 b = a + 10 a no definida a = 5

132 Valores de dos caminos a = 5 b = a + 10 a no definida a = 5 programa tonto, usa un valor no inicializado

133 Valores de dos caminos a = 5 b = a + 10 a no definida a = 5 programa tonto, usa un valor no inicializado semántica de alto nivel que el compilador no entiende hace que este sea un programa correcto

134 Lattice para Constant Propagation  = not a constant T = undefined falsetrue… ….

135 Lattice (repaso) Un lattice L consiste de –un conjunto de valores –dos operaciones meet(  ) y join (  ) –un valor top ( T ) y un valor bottom (  )

136 Lattice (repaso) Ejemplo: el lattice para el problema de reaching definitions cuándo sólo hay 3 definiciones { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 }

137 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d2, d3 } = ???

138 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d2, d3 } = ???

139 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d2, d3 } = ???

140 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d2, d3 } = { d2 }

141 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d3 } = ???

142 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d3 } = ???

143 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d3 } = ???

144 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d3 } = ???

145 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d3 } = { d1, d2, d3 }

146 Lattice para Constant Propagation  = not a constant T = undefined falsetrue… ….

147 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2 = a 2  2 =

148 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2 = a 2  2 =

149 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2 = a 2  2 = 2

150 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2a = 0 = a 2  0 =

151 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2a = 0 = a 2  0 =

152 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2a = 0 = a 2  0 =

153 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2a = 0 = a 2  0 = not a constant

154 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2undefined = a 2  undefined =

155 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2undefined = a 2  undefined =

156 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2undefined = a 2  undefined =

157 Operación Meet en el lattice  = not a constant T = undefined falsetrue… …. a = 2undefined = a 2  undefined = 2

158 Problema de Data-Flow para Constant Propagation Dominio –Para cada variable un lattice Lv Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN  resv)

159 Problema de Data-Flow para Constant Propagation Dominio –Para cada variable un lattice Lv Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN  resv) T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante  de otra forma

160 Problema de Data-Flow para Constant Propagation Dominio –Para cada variable un lattice Lv Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN  resv) T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

161 Problema de Data-Flow para Constant Propagation Dominio –Para cada variable un lattice Lv Dirección de flujo de datosHacia adelante Función de flujo de datos –OUT = gen  (IN  resv) T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante  de otra forma –prsv = x v x v = Valores Iniciales T (= undefined) T si v es el LHS  si v no es el LHS

162 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n

163 i = 1 j = 2 k = false

164 T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

165 gen ={ i: T, j: T, k: T, n: T } T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

166 gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

167 i = 1 gen ={ i:1, j: T, k: T, n: T } prsv = { i: T, j: , k: , n:  } T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

168 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 = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  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:  } T si v no es LHS –gen = x v x v = valor si v es LHS & RHS es constante.  de otra forma –prsv = x v x v = T si v es el LHS  si v no es el LHS

170 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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:  }

171 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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:  }

172 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 }

173 i = 1 j = 2 k = false gen = { i:1, j:2, k:false, n: T } prsv = { i: T, j: T, k: T, n:  } IN = { i: T, j: T, k: T, n: T }

174 i = 1 j = 2 k = false gen = { i:1, j:2, k:false, n: T } prsv = { i: T, j: T, k: T, n:  } IN = { i: T, j: T, k: T, n: T } OUT = gen  (IN  resv)  = not a constant T = undefined falsetrue… ….

175 i = 1 j = 2 k = false gen = { i:1, j:2, k:false, n: T } prsv = { i: T, j: T, k: T, n:  } IN = { i: T, j: T, k: T, n: T } OUT = gen  (IN  resv) IN = { i:1, j:2, k:false, n: T }  = not a constant T = undefined falsetrue… ….

176 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T }

177 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T }

178 i < n out1 = { i: T, j: T, k: T, n: T } out2 = { i:1, j:2, k:false, n: T } IN = out1  out2  = not a constant T = undefined falsetrue… ….

179 i < n out1 = { i: T, j: T, k: T, n: T } out2 = { i:1, j:2, k:false, n: T } IN = out1  out2 IN = { i:1, j:2, k:false, n: T }  = not a constant T = undefined falsetrue… ….

180 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T }

181 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T }

182 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T }

183 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={ i: T, j: T, k: T, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T }

184 i = 3 j = 2 gen = { i:3, j:2, k: T, n: T } prsv = { i: T, j: T, k: , n:  } IN = { i:1, j:2, k:false, n: T } OUT = gen  (IN  resv)  = not a constant T = undefined falsetrue… ….

185 i = 3 j = 2 gen = { i:3, j:2, k: T, n: T } prsv = { i: T, j: T, k: , n:  } IN = { i:1, j:2, k:false, n: T } OUT = gen  (IN  resv) IN = { i:3, j:2, k:false, n: T }  = not a constant T = undefined falsetrue… ….

186 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T }

187 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T }

188 i < n out1 = { i:1, j:2, k:false, n: T } out2 = { i:3, j:2, k:false, n: T } IN = out1  out2  = not a constant T = undefined falsetrue… ….

189 i < n out1 = { i:1, j:2, k:false, n: T } out2 = { i:3, j:2, k:false, n: T } IN = out1  out2 IN = { i: , j:2, k:false, n: T }  = not a constant T = undefined falsetrue… ….

190 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T }

191 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

192 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

193 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

194 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

195 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

196 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

197 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T }

198 j = j + 1 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)  = not a constant T = undefined falsetrue… ….

199 j = j + 1 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) IN = { i: , j: , k:false, n: T }  = not a constant T = undefined falsetrue… ….

200 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T } IN ={i: , j:2, k:false, n: T }

201 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T } IN ={i: , j:2, k:false, n: T }

202 exit out1 = { i: , j:2, k:false, n: T } out2 = { i: , j: , k:false, n: T } IN = out1  out2 IN = { i: , j: , k:false, n: T }  = not a constant T = undefined falsetrue… ….

203 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T } IN ={i: , j:2, k:false, n: T }

204 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n 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:  } 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 } prsv = { i: , j: , k: , n:  } gen ={ i: T, j: T, k: T, n: T } prsv = { i: , j: , k: , n:  } 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 } OUT ={i:3, j:2, k:false, n: T } OUT ={i:1, j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T } IN ={i: , j:2, k:false, n: T }

205 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i: , j:2, k:false, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

206 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

207 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

208 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

209 i = 1 j = 2 k = false i = 3 j = 2 print 2j = j + 1 false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

210 i = 1 j = 2 k = false i = 3 j = 2 print 2j = j + 1 false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

211 i = 1 j = 2 k = false i = 3 j = 2 print 2j = j + 1 false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

212 i = 1 j = 2 k = false i = 3 j = 2 print 2j = false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

213 i = 1 j = 2 k = false i = 3 j = 2 print 2j = false exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

214 i = 1 j = 2 k = false i = 3 j = 2 j = exit i < n IN ={ i: T, j: T, k: T, n: T } IN ={i:1, j:2, k:false, n: T } IN ={i: , j:2, k:false, n: T } OUT ={i: , j: , k:false, n: T }

215 Lecturas Ballena –Capítulo 13