Title: An
1Análisis de Control de Flujo
2Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
3Anatomía de un Compilador
Arbol de Parseo
4Ejemplo
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
56
- test
- subu fp, 16
- sw zero, 0(fp) x 0
- sw zero, 4(fp) y 0
- sw zero, 8(fp) i 0
- lab1 for(i0iltN i)
- mul t0, a0, 4 a4
- div t1, t0, a1 a4/b
- lw t2, 8(fp) i
- mul t3, t1, t2 a4/bi
- lw t4, 8(fp) i
- adduit4, t4, 1 i1
- lw t5, 8(fp) i
- adduit5, t5, 1 i1
- mul t6, t4, t5 (i1)(i1)
- addu t7, t3, t6 a4/bi (i1)(i1)
- lw t8, 0(fp) x
- add t8, t7, t8 x x a4/bi
(i1)(i1) - sw t8, 0(fp)
66
- ...
- lw t0, 4(fp) y
- mul t1, t0, a1 by
- lw t2, 0(fp) x
- add t2, t2, t1 x x by
- sw t2, 0(fp)
-
- lw t0, 8(fp) i
- adduit0, t0, 1 i1
- sw t0, 8(fp)
- ble t0, a3, lab1
-
- lw v0, 0(fp)
- addu fp, 16
- b ra
-
7Optimicemos...
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
8Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
9Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
10Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
11Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x b0
-
- return x
12Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x b0
-
- return x
13Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x b0
-
- return x
14Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x 0
-
- return x
15Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x 0
-
- return x
16Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x 0
-
- return x
17Algebraic Simplification
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x
-
- return x
18Copy Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x
-
- return x
19Copy Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
-
-
- return x
20Common Subexpression Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
-
-
- return x
21Common Subexpression Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
-
-
- return x
22Common Subexpression Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y, t
- x 0
- y 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i (i1)(i1)
-
- return x
23Common Subexpression Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y, t
- x 0
- y 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
24Dead Code Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y, t
- x 0
- y 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
25Dead Code Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y, t
- x 0
- y 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
26Dead Code Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y, t
- x 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
27Dead Code Elimination
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t
- x 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
28Loop Invariant Removal
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t
- x 0
-
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
29Loop Invariant Removal
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t
- x 0
- for(i 0 i lt N i)
- t i1
- x x (4a/b)i tt
-
- return x
30Loop Invariant Removal
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u
- x 0
- u (4a/b)
- for(i 0 i lt N i)
- t i1
- x x ui tt
-
- return x
31Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u
- x 0
- u (4a/b)
- for(i 0 i lt N i)
- t i1
- x x ui tt
-
- return x
32Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u
- x 0
- u (4a/b)
- for(i 0 i lt N i)
- t i1
- x x ui tt
-
- return x
u0, u1, u2, u3, u4, ...
v0, vvu, vvu, vvu, vvu, ...
33Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u (4a/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x ui tt
- v v u
-
- return x
34Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u (4a/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x v tt
- v v u
-
- return x
35Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u (4a/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x v tt
- v v u
-
- return x
36Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u (4a/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x v tt
- v v u
-
- return x
37Strength Reduction
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u ((altlt2)/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x v tt
- v v u
-
- return x
38Register Allocation
39Register Allocation
fp
40Ejemplo Optimizado
11
- int sumcalc(int a, int b, int N)
-
- int i
- int x, t, u, v
- x 0
- u ((altlt2)/b)
- v 0
- for(i 0 i lt N i)
- t i1
- x x v tt
- v v u
-
- return x
41- test
- subu fp, 16
- add t9, zero, zero x 0
- sll t0, a0, 2 altlt2
- div t7, t0, a1 u (altlt2)/b
- add t6, zero, zero v 0
- add t5, zero, zero i 0
- lab1 for(i0iltN i)
- adduit8, t5, 1 t i1
- mul t0, t8, t8 tt
- addu t1, t0, t6 v tt
- addu t9, t9, t1 x x v tt
- addu 6, 6, 7 v v u
- adduit5, t5, 1 i i1
- ble t5, a3, lab1
-
42Codigo No Optimizado
Codigo Optimizado
- test
- subu fp, 16
- add t9, zero, zero
- sll t0, a0, 2
- div 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, zero
- addu fp, 16
- b ra
43Pregunta Pueden Optimizar...
12
- int foobar(int N)
-
- int i, j, k, x, y
- x 0
- y 0
- k 256
- for(i 0 i lt N i)
- for(j i1 j lt N j)
- x x 4(2ij)(i2k)
- if(igtj)
- y y 8(i-j)
- else
- y y 8(j-i)
-
-
- return x
44Pregunta Pueden Optimizar...
19
- int foobar(int N)
-
- int i, j, k, x, y
- x 0
- y 0
- k 256
- for(i 0 i lt N i)
- for(j i1 j lt N j)
- x x8ii4096ij(4i2048)
-
-
- return x
45Pregunta Pueden Optimizar...
- int foobar(int N)
-
- int i, j, x, t0, t1
- x 0
- t1 2048
- for(i 0 i lt N-1 i)
- t0 (ii)ltlt3 iltlt12
- x x (N-i)t0
- for(j i1 j lt N j)
- x x t1j
-
- t1 t1 4
-
- return x
46Pregunta Pueden Optimizar...
- int foobar(int N)
-
- int i, j, x, t0, t1
- x 0
- t1 1024
- for(i 0 i lt N-1 i)
- t0 (ii)ltlt3 iltlt12
- x x (N-i)t0 t1(N(N1)-i(i1))
- t1 t1 2
-
- return x
47Pregunta Pueden Optimizar...
19
- Rendimiento
- Programa Original 17,670 ciclos
- Programa Optimizado 2,204 ciclos
- Viabilidad
- Hicimos algunas optimizaciones bastante agresivas
- Puede gcc hacer estas optimizaciones?
48Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
49Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
50Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
51Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x by
-
- return x
52Constant Propagation
- int sumcalc(int a, int b, int N)
-
- int i
- int x, y
- x 0
- y 0
- for(i 0 i lt N i)
- x x (4a/b)i (i1)(i1)
- x x b0
-
- return x
53Implementando 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
54Representando el control de flujo del progama
55Representando el control de flujo del progama
56Representando el control de flujo del progama
57Representando el control de flujo del progama
58Bloques 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(No Transcript)
60Control Flow Graph (CFG)
- Control-Flow Graph G ltN, Egt
- 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
61Control 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
62Por 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
63Retos en Control-Flow Analysis
64Construyendo 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
65Identificando loops de estructuras recursivas
66Identificando loops de estructuras recursivas
- Identificar aristas de retorno
67Identificando loops de estructuras recursivas
- Identificar aristas de retorno
- Encontrar los nodos y aristas en el loop dado por
la arista de retorno
68Identificando 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
69Identificando 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?
70Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
71Dominators
- 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
72Dominators
73Dominators
74Dominators
75Dominators
76Dominators
77Dominators
78Pregunta
- Es bb1 dom bb5? Sí!
- Es bb3 dom bb6?
79Pregunta
- Es bb1 dom bb5? Sí!
- Es bb3 dom bb6?
80Pregunta
- Es bb1 dom bb5? Sí!
- Es bb3 dom bb6?
81Pregunta
- Es bb1 dom bb5? Sí!
- Es bb3 dom bb6?
82Pregunta
- Es bb1 dom bb5? Sí!
- Es bb3 dom bb6? No!
83Dominators
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
84Computando 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
85Computando Dominators
- 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
bb1
86Computando Dominators
- 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
bb1
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
87Computando Dominators
- 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
bb1
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
88Computando Dominators
- 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
bb1
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
89Computando Dominators
- 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
bb1
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
90Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
91Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
92Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
93Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3 bb4 bb5 bb6
94Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb4 bb5 bb6
95Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb4 bb5 bb6
96Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
97Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb3 bb4 bb5 bb6
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
98Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
99Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
100Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
101Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
102Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
103Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb3 bb5
bb1 bb2 bb3 bb5 bb6
104Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb3 bb5 bb6
105Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb3 bb5 bb6
106Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
107Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
108Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
109Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
110Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
111Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
112Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
113Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
114Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
115Computando Dominators
- 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
116Computando 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
117Qué 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
118Qué 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
119Qué 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
bb1
bb1 bb2
bb1 bb2 bb4
bb1 bb2 bb3
bb1 bb2 bb5
bb1 bb2 bb5 bb6
120Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
121Recorriendo 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
122Depth-First Spanning Tree
123Preorder 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
124Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
125CFGs 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.
126CFGs Reducibles
127CFGs Reducibles
128CFGs Reducibles
129CFGs Reducibles
130CFGs Reducibles
131CFGs Reducibles
132CFGs Reducibles
133CFGs Reducibles
134CFGs Reducibles
135CFGs Reducibles
136Grafos Irreducibles
137Grafos Irreducibles
138Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
139Approaches 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)
140Aná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
141Análisis Basado en Intervalos
142Análisis Basado en Intervalos
143Análisis Basado en Intervalos
144Análisis Basado en Intervalos
145Análisis Basado en Intervalos
146Análisis Basado en Intervalos
147Resumen
5
- Overview de Optimizaciones
- Análisis de Control de Flujo
- Dominators
- Recorrido de Grafos
- Grafos Reducibles
- Análisis de Intervalos
- Algunas Definiciones
148Dominators
- 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
149Dominators
- Nodo x domina estrictamente al nodo y (x sdom y)
si - x dom y
- x ? y
bb1
bb1 bb2
bb1 bb2
bb1 bb2
bb1 bb2 bb5
150Dominators
- 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
bb2
bb2
bb5
151Dominators
- 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
bb6 bb5 bb2 bb1
bb6 bb5 bb2
bb6 bb5 bb4
bb6 bb5 bb3
bb6 bb5
bb6
152Dominators(dom)
bb0
bb0 bb1
bb0 bb1 bb4
bb0 bb1 bb2
bb0 bb1 bb4 bb6
bb0 bb1 bb2 bb3
bb0 bb1 bb4 bb5
bb0 bb1 bb4 bb6 bb7
bb0 bb1 bb4 bb8
bb0 bb1 bb4 bb8 bb9
153Strictly Dominates(sdom)
bb0
bb0 bb1
bb0 bb1
bb0 bb1 bb4
bb0 bb1 bb2
bb0 bb1 bb4
bb0 bb1 bb4 bb6
bb0 bb1 bb4
bb0 bb1 bb4 bb8
154Immediately Dominates(idom)
bb0
bb1
bb2
bb4
155Post Dominators(pdom)
bb0 bb1 bb4 bb8 bb9
bb1 bb4 bb8 bb9
bb4 bb8 bb9
bb1 bb2 bb3 bb8 bb9
bb6 bb7 bb8 bb9
bb1 bb3 bb4 bb8 bb9
bb5 bb8 bb9
bb7 bb8 bb9
bb8 bb9
bb9
156Bloques 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
157Bloques 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
158Bloques 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
159Bloques 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
160Bloques 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
161Bloques 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
162Bloques 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
163Lecturas
- Ballena
- Capitulo 8
- Dragon
- Capitulos 10.5, 10.6