Optimizaciones Tradicionales

Post on 12-Feb-2016

32 views 0 download

description

Optimizaciones Tradicionales. Simplificación Algebraica, Copy Propagation, y Constant Propagation. 40. Resumen. Overview de análisis de control de flujo Simplificación algebraica Copy Propagation Constant Propagation. Expresiones Disponibles. Dominio conjunto de expresiones - PowerPoint PPT Presentation

Transcript of Optimizaciones Tradicionales

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 datos Hacia 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 va 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 datos Hacia 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 iniciales Conjunto 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 - aa -

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 12.3.1 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

• Ejemploa = b + cd = ae = df = d + 2*e + c

24

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = df = d + 2*e + c

25

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = d + 2*e + c

26

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = d + 2*e + c

27

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = a + 2*e + c

28

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = a + 2*e + c

29

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = a + 2*a + c

30

Copy Propagation

• Eliminar copias múltiples– propagar el valor directamente a su uso

• Ejemploa = b + cd = ae = af = 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

• Ejemploa = b + cd = ae = af = a + 2*a + c

34

Ventajas de Copy Propagation

• Lleva a más simplificaciones algebraicas

• Ejemploa = b + cd = ae = af = a + 2*a + c

35

Ventajas de Copy Propagation

• Lleva a más simplificaciones algebraicas

• Ejemploa = b + cd = ae = af = 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

• Ejemploa = b + cd = ae = af = 3*a + c

38

Ventajas de Copy Propagation

• Reduce instrucciones al eliminar ops de copia– Crea código muerto que puede ser eliminado

• Ejemploa = 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 <u,v> 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 paraCopy Propagation

• Dominio– Conjunto de tuplas <v,u> representando un statement v = u

• Dirección de flujo de datos Hacia adelante• Función de flujo de datos

– OUT = gen (IN - kill)– gen = { <v,u> | v = u es el statement }– kill = { <v,u> | LHS var. del stmt. es v ó u }

• Operación Meet– IN = OUT

• Valores Iniciales Conjunto vacio (Bottom)

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> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

44

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }

gen = { }

gen = { <d,b> }

gen = { }

gen = { <b,d> }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

45

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

46

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

OUT = gen (IN - kill)

47

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

OUT = { <b,a> }

IN = { }

OUT = gen (IN - kill)

48

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

OUT = { <b,a> }

IN = { <b,a> }

IN = { }

OUT = gen (IN - kill)

49

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

OUT = { <b,a>, <d,b> }

OUT = gen (IN - kill)

50

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

IN = { <b,a>, <d,b> }

OUT = { }

OUT = gen (IN - kill)

51

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

IN = { <b,a>, <d,b> }

IN = { }

OUT = { <b,d> }

OUT = gen (IN - kill)

52

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

OUT = gen (IN - kill)

53

Ejemplo

b = a

c = b + 1

d = b

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

54

Ejemplo

b = a

c = b + 1

d = a

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

55

Ejemplo

b = a

c = b + 1

d = a

b = d + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

56

Ejemplo

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

57

Ejemplo

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,b>, <b,d> }

gen = { }kill = { }

gen = { <d,b> }kill = { <b,d> }

gen = { }kill = { <b,a> <d,b>, <b,d> }

gen = { <b,d> }kill = { <b,a>, <d,b> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,b> }

{ }

{ <b,d> }

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 = { <b,a> }

gen = { }

gen = { <d,a> }

gen = { }

gen = { <b,d> }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

60

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

61

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

OUT = { <b,a> }

IN = { }

OUT = gen (IN - kill)

62

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

OUT = { <b,a> }

IN = { <b,a> }

IN = { }

OUT = gen (IN - kill)

63

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

OUT = { <b,a>, <d,a> }

OUT = gen (IN - kill)

64

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

IN = { <b,a>, <d,a> }

OUT = { <d,a> }

OUT = gen (IN - kill)

65

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

IN = { <b,a> }

IN = { <b,a> }

IN = { }

IN = { <b,a>, <d,a> }

IN = { <d,a> }

OUT = {<d,a> ,<b,d> }

OUT = gen (IN - kill)

66

Ejemplo

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

67

Ejemplo

b = a

c = b + 1

d = a

b = b + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

68

Ejemplo

b = a

c = b + 1

d = a

b = a + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

69

Ejemplo

b = a

c = b + 1

d = a

b = a + c

b = d

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

70

Ejemplo

b = a

c = b + 1

d = a

b = a + c

b = a

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

71

Ejemplo

b = a

c = b + 1

d = a

b = a + c

b = a

gen = { <b,a> }kill = { <d,a>, <b,d> }

gen = { }kill = { }

gen = { <d,a> }kill = { <b,d> }

gen = { }kill = { <b,a>, <b,d> }

gen = { <b,d> }kill = { <b,a> }

{ <b,a> }

{ <b,a> }

{ }

{ <b,a>, <d,a> }

{ <d,a> }

{<d,a> ,<b,d> }

72

Ejemplo

b = a

c = b + 1

d = a

b = a + c

b = a

¿Terminamos?

¡Sí!

73

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

74

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }

Gen = {<d,a>, <s,p> } Gen = {<d,a> }

Gen = { }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

75

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

gen = { <v,u> | v = u es el statement }kill = { <v,u> | LHS var. del stmt. es v ó u }

76

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

OUT = gen (IN - kill)IN = OUT

77

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

78

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

79

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

80

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { }

81

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { }

82

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { }

OUT = { <d,a>, <s,p> }

83

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> }

84

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> }

85

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

86

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

IN = { <d,a> }

87

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

IN = { <d,a> }

88

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

Gen = { }Kill = {<d,a>, <s,p> }

Gen = {<d,a>, <s,p> }Kill = { }

Gen = {<d,a> }Kill = { }

Gen = { }Kill = {{<d,a> }

IN = { }OUT = gen (IN - kill)IN = OUT

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

OUT = { }

IN = { <d,a> }

89

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

IN = { }

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

OUT = { }

IN = { <d,a> }

90

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = d + p

d = a

IN = { }

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

OUT = { }

IN = { <d,a> }

91

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = a + p

d = a

IN = { }

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

OUT = { }

IN = { <d,a> }

92

Otro Ejemplo

a = b + cp = q + r

d = as = p

a = a + p

d = a

IN = { }

OUT = { }

IN = { } IN = { }

OUT = { <d,a>, <s,p> } OUT = { <d,a> }

OUT = { }

IN = { <d,a> }

93

Otro Ejemplo

a = b + cp = q + r

d = as = 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

• Ejemploa = 43b = 4d = a + 2*b + c

97

Constant Propagation

• Usar valores constantes– Usar la constante conocida para una variable

• Ejemploa = 43b = 4d = a + 2*b + c

98

Constant Propagation

• Usar valores constantes– Usar la constante conocida para una variable

• Ejemploa = 43b = 4d = 43 + 2*b + c

99

Constant Propagation

• Usar valores constantes– Usar la constante conocida para una variable

• Ejemploa = 43b = 4d = a + 2*b + c

100

Constant Propagation

• Usar valores constantes– Usar la constante conocida para una variable

• Ejemploa = 43b = 4d = 43 + 2*4 + c

101

Oportunidades paraConstant 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

• Ejemploa = 43b = 4d = 43 + 2*4 + c

104

Ventajas de Constant Propagation

• Simplificación del programa

• Ejemploa = 43b = 4d = 43 + 2*4 + c

105

Ventajas de Constant Propagation

• Simplificación del programa

• Ejemploa = 43b = 4d = 51 + c

106

Ventajas de Constant Propagation

• Habilita otras optimizaciones

107

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*a - b + ce = c + d

108

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*a - b + ce = c + d

109

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*4 - b + ce = c + d

110

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*4 - b + ce = c + d

111

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*4 - 8 + ce = c + d

112

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 2*4 - 8 + ce = c + d

113

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 8 - 8 + ce = c + d

114

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 8 - 8 + ce = c + d

115

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 0 + ce = c + d

116

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = 0 + ce = c + d

117

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + d

118

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + d

119

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + d

120

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + c

121

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + c

122

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = c + c

123

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = 2*c

124

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 8d = ce = 2*c

125

Ventajas de Constant Propagation

• Habilita otras optimizaciones

• Ejemploa = 4b = 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

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

false true …. -2 -1 0 1 2 3 4 ….

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

false true …. -2 -1 0 1 2 3 4 ….

147

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 2

= a

2 2 =

148

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 2

= a

2 2 =

149

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 2

= a

2 2 = 2

150

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 0

= a

2 0 =

151

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 0

= a

2 0 =

152

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 0

= a

2 0 =

153

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 a = 0

= a

2 0 = not a constant

154

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 undefined

= a

2 undefined =

155

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 undefined

= a

2 undefined =

156

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 undefined

= a

2 undefined =

157

Operación Meet en el lattice

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

a = 2 undefined

= a

2 undefined = 2

158

Problema de Data-Flow paraConstant Propagation

• Dominio– Para cada variable un lattice Lv

• Dirección de flujo de datos Hacia adelante• Función de flujo de datos

– OUT = gen (IN resv)

159

Problema de Data-Flow paraConstant Propagation

• Dominio– Para cada variable un lattice Lv

• Dirección de flujo de datos Hacia adelante• Función de flujo de datos

– OUT = gen (IN resv) T si v no es LHS

– gen = xv xv = valor si v es LHS & RHS es constante de otra forma

160

Problema de Data-Flow paraConstant Propagation

• Dominio– Para cada variable un lattice Lv

• Dirección de flujo de datos Hacia adelante• Función de flujo de datos

– OUT = gen (IN resv) T si v no es LHS

– gen = xv xv = valor si v es LHS & RHS es constante de otra forma

– prsv = xv xv = T si v es el LHS si v no es el LHS

161

Problema de Data-Flow paraConstant Propagation

• Dominio– Para cada variable un lattice Lv

• Dirección de flujo de datos Hacia adelante• Función de flujo de datos

– OUT = gen (IN resv) T si v no es LHS

– gen = xv xv = valor si v es LHS & RHS es constante de otra forma

– prsv = xv xv =

• Valores Iniciales T (= undefined)

T si v es el LHS si v no es el LHS

162

i = 1 j = 2k = false

i = 3 j = 2

print j j = j + 1

k

exit

i < n

163

i = 1

j = 2

k = false

164

T si v no es LHS– gen = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = 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 = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = 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 = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = 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 = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = 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 = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = 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 = xv xv = valor si v es LHS & RHS es constante.

de otra forma

– prsv = xv xv = T si v es el LHS si v no es el LHS

170

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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

false true …. -2 -1 0 1 2 3 4 ….

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

false true …. -2 -1 0 1 2 3 4 ….

176

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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

false true …. -2 -1 0 1 2 3 4 ….

179

i < n

out1 = { i:T, j:T, k:T, n:T }out2 = { i:1, j:2, k:false, n:T } IN = out1 out2IN = { i:1, j:2, k:false, n:T }

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

180

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 }

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

false true …. -2 -1 0 1 2 3 4 ….

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

false true …. -2 -1 0 1 2 3 4 ….

186

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 }

IN ={i:1, j:2, k:false, n:T }

OUT ={i:1, j:2, k:false, n:T }

187

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 }

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

false true …. -2 -1 0 1 2 3 4 ….

189

i < n

out1 = { i:1, j:2, k:false, n:T }out2 = { i:3, j:2, k:false, n:T } IN = out1 out2IN = { i:, j:2, k:false, n:T }

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

190

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 }

IN ={i:, j:2, k:false, n:T }

192

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 }

IN ={i:, j:2, k:false, n:T }

195

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 }

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

false true …. -2 -1 0 1 2 3 4 ….

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

false true …. -2 -1 0 1 2 3 4 ….

200

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 = 2k = false

i = 3 j = 2

print j j = 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 out2IN = { i:, j:, k:false, n:T }

= not a constant

T = undefined

false true …. -2 -1 0 1 2 3 4 ….

203

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 }

OUT ={i:, j:, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

204

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 }

OUT ={i:, j:, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

205

i = 1 j = 2k = false

i = 3 j = 2

print j j = 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 }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print j j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print j j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print j j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print 2 j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print 2 j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print 2 j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print 2 j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = false

i = 3 j = 2

print 2 j = 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:1, j:2, k:false, n:T }

IN ={i:, j:2, k:false, n:T }

IN ={i:, 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 = 2k = 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:1, j:2, k:false, n:T }

IN ={i:, 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