La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Compiladores Optimizaciones Tradicionales Simplificación Algebraica, Copy Propagation, y Constant Propagation."— Transcripción de la presentación:

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

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

3 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 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 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 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 7 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

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

9 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 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 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 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 13 Utilidad de Simplificación Algebraica Reduce el número de instrucciones Usa expresiones menos “caras” Habilita otras optimizaciones

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

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

19 19 Efectos en la estabilidad numérica Algunas simplificaciones algebraicas pueden producir resultados incorrectos Ejemplo –(a / b)*0 + c

20 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 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 22 Resumen Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation 40

23 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 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 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 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 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 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 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 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 31 Oportunidades para Copy Propagation En código del usuario Después de otras optimizaciones –Ejemplo: Simplificación algebraica

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

33 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 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 35 Ventajas de Copy Propagation Lleva a más simplificaciones algebraicas Ejemplo a = b + c d = a e = a f = 3*a + c

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

37 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 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 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 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 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 42 Ejemplo b = a c = b + 1 d = b b = d + c b = d

43 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 58 Ejemplo b = a c = b + 1 d = a b = b + c b = d ¿Terminamos? ¡No!

59 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 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 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 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 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 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 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 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 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 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 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 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 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 72 Ejemplo b = a c = b + 1 d = a b = a + c b = a ¿Terminamos? ¡Sí!

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

74 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 93 Otro Ejemplo a = b + c p = q + r d = a s = p a = a + p d = a

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

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

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

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

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

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

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

101 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 102 Ventajas de Constant Propagation Simplificación del programa

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

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

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

106 106 Ventajas de Constant Propagation Habilita otras optimizaciones

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

126 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 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 128 Valores de dos caminos a = 5 b = a + 10 a = 5

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

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

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

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

133 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 134 Lattice para Constant Propagation  = not a constant T = undefined falsetrue….-201234….

135 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 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 137 Operaciones Meet y Join { d1, d2 } { d2, d3 } { d1 } { d3 }  = { } T = { d1, d2, d3 } { d1, d3 } { d2 } { d1, d2 }  { d2, d3 } = ???

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

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

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

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

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

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

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

145 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 146 Lattice para Constant Propagation  = not a constant T = undefined falsetrue….-201234….

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

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

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

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

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

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

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

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

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

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

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

158 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 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 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 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 162 i = 1 j = 2 k = false i = 3 j = 2 print jj = j + 1 k exit i < n

163 163 i = 1 j = 2 k = false

164 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 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 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 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 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 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 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 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 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 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 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….-201234….

175 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….-201234….

176 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 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 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….-201234….

179 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….-201234….

180 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 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 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 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 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….-201234….

185 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….-201234….

186 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 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 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….-201234….

189 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….-201234….

190 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 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 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 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 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 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 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 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 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….-201234….

199 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….-201234….

200 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 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 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….-201234….

203 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 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 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 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 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 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 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 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 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 212 i = 1 j = 2 k = false i = 3 j = 2 print 2j = 2 + 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 }

213 213 i = 1 j = 2 k = false i = 3 j = 2 print 2j = 2 + 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 }

214 214 i = 1 j = 2 k = false i = 3 j = 2 j = 2 + 1 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 215 Lecturas Ballena –Capítulo 13


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

Presentaciones similares


Anuncios Google