análisis de control de flujo

Post on 13-Jan-2016

89 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Análisis de Control de Flujo. 5. Resumen. Overview de Optimizaciones Análisis de Control de Flujo Dominators Recorrido de Grafos Grafos Reducibles Análisis de Intervalos Algunas Definiciones. Programa (character stream). Analizador Lexico (Scanner). Token Stream. - PowerPoint PPT Presentation

TRANSCRIPT

CompiladoresAnálisis de Control de Flujo

2

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

3

Anatomía de un Compilador

Optimizador Codigo Intermedio

Generador de Codigo

Representación Intermedia Optimizada

Código en Assembler

Generador de Codigo Intermedio

Representación Intermedia

Analizador Lexico (Scanner)

Analizador Sintactico (Parser)

Token Stream

Arbol de Parseo

Programa (character stream)

4

Ejemplo

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

5

test:subu $fp, 16sw zero, 0($fp) # x = 0sw zero, 4($fp) # y = 0sw zero, 8($fp) # i = 0

lab1: # for(i=0;i<N; i++)mul $t0, $a0, 4 # a*4div $t1, $t0, $a1 # a*4/blw $t2, 8($fp) # imul $t3, $t1, $t2 # a*4/b*ilw $t4, 8($fp) # iaddui$t4, $t4, 1 # i+1lw $t5, 8($fp) # iaddui$t5, $t5, 1 # i+1mul $t6, $t4, $t5 # (i+1)*(i+1)addu $t7, $t3, $t6 # a*4/b*i + (i+1)*(i+1)lw $t8, 0($fp) # xadd $t8, $t7, $t8 # x = x + a*4/b*i + (i+1)*(i+1)sw $t8, 0($fp)...

6

6

...lw $t0, 4($fp) # ymul $t1, $t0, a1 # b*ylw $t2, 0($fp) # xadd $t2, $t2, $t1 # x = x + b*ysw $t2, 0($fp)

lw $t0, 8($fp) # iaddui$t0, $t0, 1 # i+1sw $t0, 8($fp)ble $t0, $a3, lab1

lw $v0, 0($fp)addu $fp, 16b $ra

6

7

Optimicemos...

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

8

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

9

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

10

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

11

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0; } return x;}

12

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0; } return x;}

13

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0; } return x;}

14

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0; } return x;}

15

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0; } return x;}

16

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + 0; } return x;}

17

Algebraic Simplification

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x; } return x;}

18

Copy Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x; } return x;}

19

Copy Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;}

20

Common Subexpression Elimination

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;}

21

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

}

return x;}

Common Subexpression Elimination

22

int sumcalc(int a, int b, int N){ int i; int x, y, t;

x = 0; y = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + (i+1)*(i+1); }

return x;}

Common Subexpression Elimination

23

int sumcalc(int a, int b, int N){ int i; int x, y, t;

x = 0; y = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

Common Subexpression Elimination

24

Dead Code Elimination

int sumcalc(int a, int b, int N){ int i; int x, y, t;

x = 0; y = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

25

Dead Code Elimination

int sumcalc(int a, int b, int N){ int i; int x, y, t;

x = 0; y = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

26

Dead Code Elimination

int sumcalc(int a, int b, int N){ int i; int x, y, t;

x = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

27

Dead Code Elimination

int sumcalc(int a, int b, int N){ int i; int x, t;

x = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

28

Loop Invariant Removal

int sumcalc(int a, int b, int N){ int i; int x, t;

x = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

29

Loop Invariant Removal

int sumcalc(int a, int b, int N){ int i; int x, t;

x = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + (4*a/b)*i + t*t; }

return x;}

30

Loop Invariant Removal

int sumcalc(int a, int b, int N){ int i; int x, t, u;

x = 0; u = (4*a/b);

for(i = 0; i <= N; i++) { t = i+1;

x = x + u*i + t*t; }

return x;}

31

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u;

x = 0; u = (4*a/b);

for(i = 0; i <= N; i++) { t = i+1;

x = x + u*i + t*t; }

return x;}

32

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u;

x = 0; u = (4*a/b);

for(i = 0; i <= N; i++) { t = i+1;

x = x + u*i + t*t; }

return x;}

u*0, u*1, u*2, u*3, u*4,...

v=0, v=v+u,v=v+u,v=v+u,v=v+u,...

33

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = (4*a/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + u*i + t*t; v = v + u;

} return x;}

34

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = (4*a/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + v + t*t; v = v + u;

} return x;}

35

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = (4*a/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + v + t*t; v = v + u;

} return x;}

36

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = (4*a/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + v + t*t; v = v + u;

} return x;}

37

Strength Reduction

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = ((a<<2)/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + v + t*t; v = v + u;

} return x;}

38

Register Allocation

fpVariable local X Variable local Y Variable local I

39

Register Allocation

$t9 = X$t8 = t$t7 = u$t6 = v$t5 = i

fpVariable local X Variable local Y Variable local I

40

Ejemplo Optimizado

int sumcalc(int a, int b, int N){ int i; int x, t, u, v;

x = 0; u = ((a<<2)/b); v = 0;

for(i = 0; i <= N; i++) { t = i+1;

x = x + v + t*t; v = v + u;

} return x;}

11

41

test:subu $fp, 16add $t9, zero, zero # x = 0sll $t0, $a0, 2 # a<<2div $t7, $t0, $a1 # u = (a<<2)/badd $t6, zero, zero # v = 0add $t5, zero, zero # i = 0

lab1: # for(i=0;i<N; i++)addui$t8, $t5, 1 # t = i+1mul $t0, $t8, $t8 # t*taddu $t1, $t0, $t6 # v + t*taddu $t9, t9, $t1 # x = x + v + t*t

addu $6, $6, $7 # v = v + u

addui$t5, $t5, 1 # i = i+1ble $t5, $a3, lab1

addu $v0, $t9, zeroaddu $fp, 16b $ra

42

test:subu $fp, 16add $t9, zero, zero sll $t0, $a0, 2div $t7, $t0, $a1 add $t6, zero, zero add $t5, zero, zero

lab1: addui $t8, $t5, 1 mul $t0, $t8, $t8 addu $t1, $t0, $t6 addu $t9, t9, $t1 addu $6, $6, $7 addui $t5, $t5, 1 ble $t5, $a3, lab1

addu $v0, $t9, zeroaddu $fp, 16b $ra

test:subu $fp, 16sw zero, 0($fp) sw zero, 4($fp) sw zero, 8($fp)

lab1: mul $t0, $a0, 4 div $t1, $t0, $a1 lw $t2, 8($fp) mul $t3, $t1, $t2 lw $t4, 8($fp) addui $t4, $t4, 1 lw $t5, 8($fp) addui $t5, $t5, 1 mul $t6, $t4, $t5 addu $t7, $t3, $t6 lw $t8, 0($fp) add $t8, $t7, $t8 sw $t8, 0($fp)lw $t0, 4($fp) mul $t1, $t0, a1 lw $t2, 0($fp) add $t2, $t2, $t1 sw $t2, 0($fp)lw $t0, 8($fp) addui $t0, $t0, 1 sw $t0, 8($fp)ble $t0, $a3, lab1

lw $v0, 0($fp)addu $fp, 16b $ra

4*ld/st + 2*add/sub + br +N*(9*ld/st + 6*add/sub + 4* mul + div + br)= 7 + N*21

6*add/sub + shift + div + br +N*(5*add/sub + mul + br)= 9 + N*7

Codigo No Optimizado Codigo Optimizado

Tiempo de Ejecución = 17 secTiempo de Ejecución = 43 sec

43

Pregunta: Pueden Optimizar...int foobar(int N){ int i, j, k, x, y; x = 0; y = 0; k = 256; for(i = 0; i <= N; i++) { for(j = i+1; j <= N; j++) {

x = x + 4*(2*i+j)*(i+2*k);if(i>j)

y = y + 8*(i-j);else

y = y + 8*(j-i); }

} return x;}

12

44

Pregunta: Pueden Optimizar...int foobar(int N){ int i, j, k, x, y; x = 0; y = 0; k = 256; for(i = 0; i <= N; i++) { for(j = i+1; j <= N; j++) {

x = x+8*i*i+4096*i+j*(4*i+2048); }

} return x;}

19

45

Pregunta: Pueden Optimizar...int foobar(int N){ int i, j, x, t0, t1; x = 0;

t1 = 2048; for(i = 0; i <= N-1; i++) { t0 = (i*i)<<3 + i<<12;

x = x + (N-i)*t0; for(j = i+1; j <= N; j++) {

x = x + t1*j; }

t1 = t1 + 4; }

return x;}

46

Pregunta: Pueden Optimizar...int foobar(int N){ int i, j, x, t0, t1; x = 0;

t1 = 1024; for(i = 0; i <= N-1; i++) { t0 = (i*i)<<3 + i<<12;

x = x + (N-i)*t0 + t1*(N*(N+1)-i*(i+1));

t1 = t1 + 2; }

return x;}

47

Pregunta: Pueden Optimizar...

• Rendimiento– Programa Original: 17,670 ciclos– Programa Optimizado: 2,204 ciclos

• Viabilidad– Hicimos algunas optimizaciones bastante

agresivas– ¿Puede gcc hacer estas optimizaciones?

19

48

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

49

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

50

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

51

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*y; } return x;}

52

Constant Propagation

int sumcalc(int a, int b, int N){ int i; int x, y;

x = 0; y = 0;

for(i = 0; i <= N; i++) { x = x + (4*a/b)*i + (i+1)*(i+1);

x = x + b*0; } return x;}

53

Implementando constant propagation

• Encontrar una expresión LHS que sea constante

• Reemplazar el uso de la variable RHS con la constante LHS dado que:– Todos los caminos al uso del RHS pasan por la

asignación del RHS como constante– No hay definiciones intermedias de la variable RHS

• Necesitamos saber el “control de flujo” del programa

54

• Instrucciones Jump– Ejecutan una localidad diferente– Salto en el control de flujo

Representando el control de flujo del progama

• La mayoria de instrucciones – Se ejecuta la siguiente instrucción– Control de flujo es una linea recta

• Instrucciones Branch– Ejecutan ya sea la siguiente intrucción o una

localidad diferente– Fork en el control de flujo

55

Representando el control de flujo del progama

• Forma un grafo

• Un grafo muy grande

• Observación– Muchas conexiones de línea recta– Simplificamos el grafo agrupando algunas

instrucciones

56

Representando el control de flujo del progama

• Forma un grafo

• Un grafo muy grande

• Observación– Muchas conexiones de línea recta– Simplificamos el grafo agrupando algunas

instrucciones

57

Representando el control de flujo del progama

• Forma un grafo

• Un grafo muy grande

• Observación– Muchas conexiones de línea recta– Simplificamos el grafo agrupando algunas

instrucciones

58

Bloques Básicos

• Un bloque básico es una secuencia máxima de instrucciones tales que– Sólo la primera instruccion puede ser alcanzada

desde afuera del bloque básico– Si la primera instrucción es ejecutada, todas las

demás instrucciones son ejecutadas consecutivamente

• No hay instrucciones branch o jump en el bloque básico– Excepto en la última instruccion

• No hay etiquetas en el bloque básico– Excepto antes de la primera instrucción

59

test:subu $fp, 16sw zero, 0($fp)

sw zero, 4($fp)

sw zero, 8($fp)

lab1:

mul $t0, $a0, 4

div $t1, $t0, $a1

lw $t2, 8($fp)

mul $t3, $t1, $t2

lw $t4, 8($fp)

addui $t4, $t4, 1lw $t5,

8($fp) addui $t5, $t5, 1

mul $t6, $t4, $t5 addu $t7, $t3, $t6

lw $t8, 0($fp) add $t8, $t7, $t8 sw $t8, 0($fp)lw $t0, 4($fp)

mul $t1, $t0, a1 lw $t2, 0($fp) add $t2, $t2, $t1 sw $t2, 0($fp)lw $t0, 8($fp)

addui $t0, $t0, 1 sw $t0, 8($fp)ble $t0, $a3, lab1

lw $v0, 0($fp)addu $fp, 16b $ra

60

Control Flow Graph (CFG)• Control-Flow Graph G = <N, E>

• Nodes(N): Bloques Básicos

• Edges(E): (x,y) E ssi la primera instrucción en el bloque básico y sigue a una instrucción en el bloque básico x– Primera instrucción en y es el target de una

instrucción branch o jump (última instrucción) en el bloque básico x

– Primera instrucción de y es la siguiente a la última instrucción de x en memoria y la última instrucción de x no es una instrucción jump

61

Control Flow Graph (CFG)

• El bloque con la primera instrucción de un procedimiento es un entry node (bloque con la etiqueta del procedimiento)

• Los bloques con la instrucción de retorno (jr) son los exit nodes– Se puede hacer un solo exit node agregando un

nodo especial

62

¿Por qué hacerControl-flow Analysis?

• Es importante optimizar los loops– Los programas pasan mucho tiempo en loops y

ciclos recursivos– Se pueden hacer muchas optimizaciones

especiales en los loops

• Los programadores organizan el código usando estructuras de control de flujo (if-then-else, for-loops etc.)– Optimizador puede aprovecharse de esto– Pero hay que descubrirlos primero

63

Retos en Control-Flow Analysis

• Control de flujo no estructurado– Uso de goto’s por el programador– Unica forma de construir ciertas

estructuras de control

L1: x = 0

if (y > 0) goto L3

L2: if (y < 0) goto L1

L3: y = y + z

goto L2

• Control de flujo obscurecido– Invocaciones de metodos– Variables de procedimiento– Funciones de alto orden– Tablas de jumps

Myobject->run()

64

Construyendo CFGs

• Simple:– Programas son escritos usando control de flujo

estructurado– Tienen patrones simples de CFG

• ¡No es así!– Gotos pueden crear patrones de control de flujo

diferentes a lo que está dado por el control de flujo estructurado

– Necesitamos hacer análisis para identificar los verdaderos patrones de control de flujo

65

Identificando loops de estructuras recursivas

bb1

bb2

bb4bb3

bb5

bb6

66

Identificando loops de estructuras recursivas

• Identificar aristas de retornobb1

bb2

bb4bb3

bb5

bb6

67

Identificando loops de estructuras recursivas

• Identificar aristas de retorno

• Encontrar los nodos y aristas en el loop dado por la arista de retorno

bb1

bb2

bb4bb3

bb5

bb6

68

Identificando loops de estructuras recursivas

• Identificar aristas de retorno

• Encontrar los nodos y aristas en el loop dado por la arista de retorno

• Aparte de la arista de retorno– Aristas entrantes sólo al bloque

básico con la cabeza de la arista de retorno

– Una arista saliente del bloque básico a la cola de la arista de retorno

bb1

bb2

bb4bb3

bb5

bb6

69

Identificando loops de estructuras recursivas

• Identificar aristas de retorno• Encontrar los nodos y aristas en el

loop dado por la arista de retorno• Aparte de la arista de retorno

– Aristas entrantes sólo al bloque básico con la cabeza de la arista de retorno

– Una arista saliente del bloque básico a la cola de la arista de retorno

• ¿Cómo encontramos las aristas de retorno?

bb1

bb2

bb4bb3

bb5

bb6

70

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

71

Dominators

• El nodo x domina al nodo y (x dom y) si todo camino de ejecución posible desde la entrada hasta el nodo y incluye el nodo x

72

Dominators

• ¿Es bb1 dom bb5?

bb1

bb2

bb4bb3

bb5

bb6

73

Dominators

• ¿Es bb1 dom bb5?

bb1

bb2

bb4bb3

bb5

bb6

74

Dominators

• ¿Es bb1 dom bb5?

bb1

bb2

bb4bb3

bb5

bb6

75

Dominators

• ¿Es bb1 dom bb5?

bb1

bb2

bb4bb3

bb5

bb6

76

Dominators

• ¿Es bb1 dom bb5?

bb1

bb2

bb4bb3

bb5

bb6

77

Dominators

• ¿Es bb1 dom bb5? ¡Sí!

bb1

bb2

bb4bb3

bb5

bb6

78

Pregunta

• ¿Es bb1 dom bb5? ¡Sí!

• ¿Es bb3 dom bb6?bb1

bb2

bb4bb3

bb5

bb6

79

Pregunta

• ¿Es bb1 dom bb5? ¡Sí!

• ¿Es bb3 dom bb6?bb1

bb2

bb4bb3

bb5

bb6

80

Pregunta

• ¿Es bb1 dom bb5? ¡Sí!

• ¿Es bb3 dom bb6?bb1

bb2

bb4bb3

bb5

bb6

81

Pregunta

• ¿Es bb1 dom bb5? ¡Sí!

• ¿Es bb3 dom bb6?bb1

bb2

bb4bb3

bb5

bb6

82

Pregunta

• ¿Es bb1 dom bb5? ¡Sí!

• ¿Es bb3 dom bb6? ¡No!bb1

bb2

bb4bb3

bb5

bb6

83

Dominators

bb1

bb2

bb4bb3

bb5

bb6

bb1bb2

{bb1}

bb1bb2bb3

bb1bb2bb4

bb1bb2bb5

bb1bb2bb5bb6

84

Computando Dominators

• a dom b ssi– a = b o– a es el unico predecesor inmediato de b o– a es un dominador de todos los predecesores inmediatos de b

• Algoritmo– Hacer que el conjunto de dominators del nodo de entrada

sólo contenga ese nodo– Hacer que el conjunto de dominators del resto de los nodos

contenga todos los nodos– Visitar los nodos en cualquier orden– Hacer que el conjunto de dominators del nodo actual sea la

intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

85

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

86

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

87

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

88

Computando Dominators

bb1

bb2

bb4bb3

bb5

bb6

{bb1}

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

89

Computando Dominators

bb1

bb2

bb4bb3

bb5

bb6

{bb1}

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

90

Computando Dominators

bb1

bb2

bb4bb3

bb5

bb6

{bb1}

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2

91

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2

bb1bb2bb3bb4bb5bb6

92

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2bb3bb4bb5bb6

bb1bb2

93

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2

bb1bb2bb3bb4bb5bb6

94

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5

95

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb4bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5

96

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5

97

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb3bb5bb6

bb1bb2bb3bb4bb5bb6

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5

98

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

99

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

100

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

101

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

102

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

103

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb3bb5

104

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb5

105

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb3bb5bb6

bb1bb2bb5

106

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

107

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

108

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

109

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

110

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

111

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

112

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

113

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

114

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

115

Computando Dominators

bb2

bb4bb3

bb5

bb6

{bb1} bb1

• Algoritmo– Hacer que el conjunto de

dominators del nodo de entrada sólo contenga ese nodo

– Hacer que el conjunto de dominators del resto de los nodos contenga todos los nodos

– Visitar los nodos en cualquier orden

– Hacer que el conjunto de dominators del nodo actual sea la intersección del conjunto de dominators del nodo predecesor y el nodo actual

– Repetir hasta que no hayan cambios

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

116

Computando Dominators

• Lo que vimos fue un algoritmo iterativo de análisis de flujo de datos en acción– Inicializa todos los nodos a un valor dado– Visita los nodos en algún orden– Calcula el valor del nodo– Se repite hasta que no cambie ningún valor

• Vamos a hablar de esto en la próxima clase

117

¿Qué es una arista de retorno?

• Un edge (x, y) E es una arista de retorno ssi y dom x– el nodo y está en el

conjunto de dominators del nodo x

118

¿Qué es una arista de retorno?

• Un edge (x, y) E es una arista de retorno ssi y dom x– el nodo y está en el

conjunto de dominators del nodo x

bb2

bb4bb3

bb5

bb6

{bb1} bb1

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

119

¿Qué es una arista de retorno?

• Un edge (x, y) E es una arista de retorno ssi y dom x– el nodo y está en el

conjunto de dominators del nodo x

bb2

bb4bb3

bb5

bb6

{bb1} bb1

bb1bb2bb4

bb1bb2bb3

bb1bb2

bb1bb2bb5bb6

bb1bb2bb5

120

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

121

Recorriendo el CFG

• Depth-First Traversal – Visita todos los descendientes del nodo ántes de

visitar a los hermanos

• Depth-first spanning tree– Un conjunto de aristas correspondientes a una visita

depth-first del CFG

122

Depth-First Spanning Tree

bb2

bb4bb3

bb5

bb6

bb1

123

Preorder y Postorder

• En recorrido preorder, cada nodo es procesado antes que sus descendientes en el árbol depth-first

• En recorrido postorder, cada nodo es procesado después que sus descendientes en el árbol depth-first

124

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

125

CFGs Reducibles

• La reducibilidad formaliza la buena estructuración de un programa

• Un grafo es reducible ssi aplicar múltiples veces las siguientes dos acciones resulta en un grafo con un solo nodo– Reemplazar loops a él mismo con un solo nodo– Reemplazar una secuencia de nodos en la que todas

las aristas entrantes son al primer nodo y todas las aristas salientes son del último nodo, por un solo nodo.

126

CFGs Reducibles

bb2

bb4bb3

bb5

bb6

bb1

bb2

bb4bb3

bb5

bb6

bb1

127

CFGs Reducibles

bb2

bb4bb3

bb5

bb6

bb1

bb6

bb1

bb2

bb4bb3

bb5

128

CFGs Reducibles

bb2

bb4bb3

bb5

bb6

bb1

bb2x

bb6

bb1

129

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5bb6

bb1

bb2x

130

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5

bb2x

bb6

bb1

131

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5

bb2y

bb6

bb1

132

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5bb6

bb1

bb2y

133

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5bb6

bb1

bb2y

134

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5bb6

bb1

bb1z

135

CFGs Reducibles

bb6

bb1

bb2

bb4bb3

bb5

bb1z

136

Grafos Irreducibles

137

Grafos Irreducibles

138

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

139

Approaches para análisis de control de flujo

• Análisis Iterativo– Usar un CFG– Propagar valores– Iterar hasta que no hayan cambios

• Análisis Basado en Intervalos– Usar un CFG reducible– Calcular en grafos jerárquicos– No hay iteraciones (más rápido)

140

Análisis Basado en Intervalos

• Si un nodo no incluye un grafo:– Calcular el valor

• Si un nodo incluye un grafo– Calcular valores de los nodos en el grafo– Propagar valores (no aristas de retorno no

iteracion)– Usar valor de entrada (o salida) como valor del

nodo que contiene este grafo

141

Análisis Basado en Intervalos

bb6

bb1

bb2

bb4bb3

bb5

142

Análisis Basado en Intervalos

bb6

bb1

bb2

bb4bb3

bb5

143

Análisis Basado en Intervalos

bb6

bb1

144

Análisis Basado en Intervalos

bb6

bb1

145

Análisis Basado en Intervalos

bb6

bb1

146

Análisis Basado en Intervalos

147

Resumen

• Overview de Optimizaciones• Análisis de Control de Flujo• Dominators• Recorrido de Grafos• Grafos Reducibles• Análisis de Intervalos• Algunas Definiciones

5

148

Dominators

• Nodo x domina al nodo y (x dom y) si todo camino de ejecución posible desde la entrada hasta el nodo y incluye al nodo x

bb1

bb2

bb4bb3

bb5

bb6

bb1bb2

{bb1}

bb1bb2bb3

bb1bb2bb4

bb1bb2bb5

bb1bb2bb5bb6

149

Dominators

• Nodo x domina estrictamente al nodo y (x sdom y) si– x dom y– x y bb1

bb2

bb4bb3

bb5

bb6

bb1

{}

bb1bb2

bb1bb2

bb1bb2

bb1bb2bb5

150

Dominators

• Nodo x domina inmediatamente al nodo y (x idom y) si – x dom y– x y– c N tal que

c x & c y & x dom c & c dom y

bb1

bb2

bb4bb3

bb5

bb6

bb1

{}

bb2 bb2

bb2

bb5

151

Dominators

• Nodo x post domina al nodo y (x pdom y) si todo camino de ejecucion posible desde el nodo y hasta el nodo de salida incluye al nodo x bb1

bb2

bb4bb3

bb5

bb6

bb6bb5bb2

bb6bb5bb3

bb6bb5bb4

bb6bb5

bb6

bb6bb5bb2bb1

152

Dominators(dom)

bb1

bb4

bb6

bb5

bb8

bb9

bb0bb1bb4

bb0bb1bb4bb5

bb0bb1bb4bb6

bb0bb1bb4bb8

bb0bb1bb4bb8bb9

bb0bb1

bb0bb0

bb3bb0bb1bb2bb3

bb2bb0bb1bb2

bb7bb0bb1bb4bb6bb7

153

Strictly Dominates(sdom)

bb1

bb4

bb6

bb5

bb8

bb9

bb0bb1

bb0bb1bb4

bb0bb1bb4

bb0bb1bb4

bb0bb1bb4bb8

bb0

bb0

bb3bb0bb1bb2

bb2bb0bb1

bb7bb0bb1bb4bb6

154

Immediately Dominates

(idom) bb1

bb4

bb6

bb5

bb8

bb9

bb0

bb0

bb3

bb2

bb7

bb1

bb2

bb1

bb4

bb4

bb8

bb4

bb6

155

Post Dominators(pdom)

bb1

bb4

bb6

bb5

bb8

bb9

bb4bb8bb9

bb5bb8bb9

bb6bb7bb8bb9

bb8bb9

bb9

bb1bb4bb8bb9

bb0

bb0bb1bb4bb8bb9

bb3bb1bb3bb4bb8bb9

bb2

bb1bb2bb3bb8bb9

bb7bb7bb8bb9

156

Bloques Básicos• Un bloque básico es una secuencia

máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque

– Si la primera instrucción es ejecutada, todas las demás instrucciones son ejecutadas consecutivamente

• No instrucciones branch ni jump en el bloque básico

– Excepto la última instruccion

• No etiquetas dentro del bloque básico– Excepto antes de la primera instrucción

157

Bloques Básicos• Un bloque básico es una secuencia

máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque

– Si la primera instrucción es ejecutada, todas las demás instrucciones son ejecutadas consecutivamente

• No instrucciones branch ni jump en el bloque básico

– Excepto la última instruccion

• No etiquetas dentro del bloque básico– Excepto antes de la primera instrucción

158

Bloques Básicos Extendidos• Un bloque básico extendido es una

secuencia máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque• No etiquetas dentro del bloque básico

excepto ántes de la primera instrucción

159

Bloques Básicos Extendidos• Un bloque básico extendido es una

secuencia máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque• No etiquetas dentro del bloque básico

excepto ántes de la primera instrucción

160

Bloques Básicos Extendidos• Un bloque básico extendido es una

secuencia máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque• No etiquetas dentro del bloque básico

excepto ántes de la primera instrucción

161

Bloques Básicos Extendidos• Un bloque básico extendido es una

secuencia máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque• No etiquetas dentro del bloque básico

excepto ántes de la primera instrucción

• Rearreglamos el grafo para reducir el número de bloques básicos

162

Bloques Básicos Extendidos• Un bloque básico extendido es una

secuencia máxima de instrucciones tal que– Sólo la primera instrucción puede

alcanzarse desde fuera del bloque• No etiquetas dentro del bloque básico

excepto ántes de la primera instrucción

• Rearreglamos el grafo para reducir el número de bloques básicos

163

Lecturas

• Ballena– Capitulo 8

• Dragon– Capitulos 10.5, 10.6

top related