Professional Documents
Culture Documents
Transformaciones que preservan la estructura 3.2.1. Introduccin al anlisis de flujo de datos 3.2.2. Algunas transformaciones que preservan la estructura 3.2.3. Grafos dirigidos acclicos: GDAs 3.2.4. Reconstruccin del cdigo intermedio a partir de un GDA 4. Optimizaciones globales 4.1. Tcnicas bsicas 4.2. Deteccin de bucles 4.3. Extraccin de cdigo invariante 4.4. Reduccin de intensidad y eliminacin de variables de induccin
Ejemplo de optimizacin
Cdigo fuente
var a: array [1..10, 1..20] of integer; {talla entero-2} while a[i, k] < M do k := k 1;
Cdigo intermedio: 100 101 102 103 104 105 106 107 108
Cdigo mejorado:
V. 11
Entrada: Una secuencia de instrucciones de tres direcciones. Salida: Una lista de bloques bsicos
Mtodo: 1. Se determina el conjunto de lderes (la primera proposicin de cada bloque bsico). (i) La primera proposicin es un lder (ii) Cualquier prop. destino de un salto es un lder. (iii) Cualquier prop. que vaya despus de un salto es un lder. 2. Para cada lder, su bloque bsico consta del lder y de todas las proposiciones hasta, sin incluir, el siguiente lder o el fin del programa.
131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145:
i := m-1 j := n t1 := 4*n v := a[t1] i := i+1 t2 := 4*i t3 := a[t2] if t3<v goto 135 j := j-1 t4 := 4*j t5 := a[t4] if t5>v goto 139 if i>=j goto 153 t6 := 4*i x := a[t6]
146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160:
t7 := 4*i t8 := 4*j t9 := a[t8] a[t7] := t9 t10 := 4*j a[t10] := x goto 135 t11 := 4*i x := a[t11] t12 := 4*i t13 := 4*n t14 := a[t13] a[t12] := t14 t15 := 4*n a[t15] := x
Ejemplo 2
B1
i := m-1 j := n t1 := 4*n v := a[t1] B2 i := i+1 t2 := 4*i t3 := a[t2] if t3<v goto B2 B3 j := j-1 t4 := 4*j t5 := a[t4] if t5>v goto B3 B4 if i>=j goto B6 var a: array [0..9, 0..9, 0..9] of integer; b: array [0..9, 0..9] of integer; for j := 0 to 9 do for k := 0 to 9 do b[5, k ] := b[5, k] + a[5, j, k] ; (j, y k no estn activas a la salida de los dos for)
Cdigo intermedio
t1 := 0 t13:= t12 * 10 j := t1 t14:= t13 + k t2 := 9 t15:= t14 * 2 L1: if j > t2 goto L3 t16:= a[t15] t3 := 0 t17:= t9 + t16 t18:= 5 k := t3 t19:= t18 * 10 t4 := 9 t20:= t19 + k L2: if k > t4 goto L4 t21:= t20 * 2 t5 := 5 b[t21]:= t17 t6 := t5 * 10 k := k + 1 t7 := t6 + k goto L2 t8 := t7 * 2 L4: j := j + 1 t9 := b[t8] goto L1 t10:= 5 L3: t11:= t10 * 10 t12:= t11 + j
B5 t6 := 4*i x := a[t6] t7 := 4*i t8 := 4*j t9 := a[t8] a[t7] := t9 t10 := 4*j a[t10] := x goto B2 t11 := 4*i x := a[t11] t12 := 4*i t13 := 4*n t14 := a[t13] a[t12] := t14 t15 := 4*n a[t15] := x
B6
Transformaciones algebraicas
1. Simplificaciones algebraicas:
B7
B2
B3
t3 := 0 k := t3 t4 := 9
Expresiones de identidad: identidad = Propiedad conmutativa: = Propiedad asociativa: ( ) = ( ) Operador 1 distributivo respecto a 2: 1 ( 2 ) = ( 1 ) 2 ( 1 ) Operador unario autoinverso: = A*(B*C)+(B*A)*D+A*E = A*(B*(C+D)+E)
B4
if k > t4 goto B6
B6
B5
t5 := 5 t6 := 10 * t5 t7 := t6 + k t8 := t7 * 2 t9 := b[t8] t10 := 5 t11 := 10 * t10 t12 := t11 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 t18 := 5 t19 := 10 * t18 t20 := t19 + k t21 := t20 * 2 b[t21] := t17 k := k + 1 goto B4
j := j + 1 goto B2
y := 3 t1 := 2 + y t2 := t1 + z x := t2 + 5 Precauciones:
x := 10 + z
Variables activas
Una variable est activa en un arco del grafo de flujo si existe un camino dirigido desde ese arco a un uso de la variable que no pasa por ninguna definicin de la variable.
Ejemplo (1) (2) (3) x := (I) x := y + z (II) a := x + b (III) (4) (5) (6) (I) (II) (III) y := a + x if x < 5 goto 2 b := x {y, z, b} B = ({ f := a + b; g := a * b}, {a, b}, {f, g}) {x, b, z} {a, x, b, z} 4. Renombrar variables temporales 5. Intercambiar dos instrucciones adyacentes independientes. t1 := b + c t2 := x + y 3. Eliminacin de cdigo inactivo 2.- Propagacin de copias
(1) x := t3 (2) t9 := t5 (3) a[t2] := t9 (4) a[t4] := x (1) x := t3 (2) t9 := t5 (3) a[t2] := t5 (4) a[t4] := t3
B = ({ f := a + a; g := f * c; f := a + b; g := a * b}, {a, b, c}, {f, g}) B = ({ f := a + a; f := a + b; g := a * b}, {a, b, c}, {f, g})
10
(1)
si ult_nodo(y) = NIL ent ult_nodo(y) := Crear_nodo(y) si ult_nodo(z) = NIL ent ult_nodo(z) := Crear_nodo(z) si (nodo.etiq=op nodo.izq=ult_nodo(y) nodo.der=ult_nodo(z)) ent nodo := CrearNodo(op) nodo.izq := ult_nodo(y) nodo.der := ult_nodo(z) si ult_nodo(x) NIL ent ult_nodo(x).lista_vbles := ult_nodo(x).lista_vbles {x} nodo.lista_vbles := nodo.lista_vbles + {x} ult_nodo(x) := nodo finpara
[]
t2
* prod a b 4
20
12
{x }
- { c, z }
10
5 { t5 }
Nuevo GDA:
+
* { t7 } 50 { t6 }
{ t8 }
z := a - d x := a c y := a z
y := a c x := a c z := a d
c := a - d z := c x := a c y := a z
13
14
4. En los casos en que haya que seguir un determinado orden, ste deber hacerse constar en el GDA.
5. Cdigo intil.
{}
3. En un nodo se elegir como variable, para contener el valor de la expresin, aquella que est activa a la salida del bloque. Si no hubiera ninguna se elegir cualquier variable. Si a la salida hay ms de una activa se generarn tantas instrucciones de copia como sea necesario. En el caso de las hojas: Si la etiqueta es una variable y no se modifica dentro del bloque, se considerara est junto a su lista de variables y se aplicar el mismo criterio. Si la etiqueta es una constante, y ninguna variable en el campo lista_vbles est activa a la salida del bloque, no se generara ninguna instruccin para evaluar esta hoja.
f := a + a g := f * c f := a + b g := a * b
+ {f} + { } * {g} a b c
Cdigo obtenido: f := a + b g := a * b
15
16
Cdigo fuente:
a: array [1..100] of integer; {talla integer 4 u.m.} z := a[i] + b[i] (P, {a, i, b}, {z}) GDA
Bloque bsico:
t1 := 4 * i t2 := a[t1] t3 := 4 * i t4 := b[t3] t5 := t2 + t4 z := t5
+ [] { t4 } b a
{ t5 , z } [] { t2 }
+ t7, t20
t13
* { t1, t3 } 4 l
* t6, t11 t19 + k
t12
10
17
18
B1
j := 0 t2 := 9
B7
B2
1 3 4 5 7 6
B3
k := 0 t4 := 9
B4
if k > t4 goto B6
B6
8 9
10
B5
t7 := 50 + k t8 := t7 * 2 t9 := b[t8] t12 := 50 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 b[t8] := t17 k := k + 1 goto B4
j := j + 1 goto B2
Arista de retroceso 7 4 10 7 9 1
19
20
Cdigo invariante (1) a:= 5 + N (2) i := i +1 (3) b := a * 4 (4) arr[i] := b (5) if a < N goto (1) (6) x:= t
(1) a:= 5 (2) if b > 2 goto (4) (3) a := 4 (4) b := 2 * b (5) if b < N goto (2) (6) x := a Algoritmo de extraccin de cdigo invariante Para toda Ii marcada (segn su orden de marcado) que defina x y cumpla:
i) Est en un bloque que domina todas las salidas del bucle, (o x no est activa a la salida del bucle). ii) x no se define en otra parte del bucle. iii) Todos los usos de x en el bucle solo pueden ser alcanzados por esa definicin de x. iv) Los valores de los operandos son constantes o se definen ya en el pre-encabezamiento. hacer Extraer Ii al final del pre-encabezamiento.
21
22
B1
if u<v goto B3 B2
B3 B4
j := i
j := i B5 j := i B5
B5
No cumple la 2 condicin
(a) Antes
(b) Despus
i := 1
B1
j := i
B5
No cumple la 3 condicin
23 24
Deteccin de variables de induccin Algoritmo Deteccin de variables de induccin Entrada Bucle con informacin sobre el alcance y clculos invariantes Salida Familias de variables de induccin Mtodo 1) Encontrar todas las variables bsicas de induccin (i). Asociar a cada una el triple (i, 1, 0). 2) Buscar las variables k con una sola definicin dentro del bucle de la forma: k := j*b, k := b*j, k := j/b, k := jb, k := bj donde b es una cte. y j una vble. de induccin Si j es variable de induccin bsica entonces k est en la familia de j sino /* j pertenece a familia(i) */ si ( definicin de i entre la definicin de j y la de k) ( ninguna definicin de j fuera del bucle alcanza la definicin de k) entonces k est en la familia de i. Asociar a cada una el triple correspondiente.
(0) (1) (2) (3) (4) (5) (6) (7) i := i + 3 t1 := 2 * i j := t1 + 5 t2 := 3 * j k := t2 + 6 m := a[j] a[k] := m if i < N goto (0)
Variables de induccin
i t1 j t2 k (i, 1, 0) (i, 2, 0) (i, 2, 5) (i, 6, 15) (i, 6, 21)
Excepciones
A) 10 11 12 13 j:=3*i i:=i+1 k:=2*j if i < N goto 10
B)
10 11 12 13 14 15
25
26
Algoritmo Reduccin de intensidad aplicada a variables de induccin. Mtodo Para toda variable de induccin bsica i hacer Para todo triple (i, c, d) asociado a las variables de induccin j1, j2, ... jn, de la Familia(i) hacer 1) Crear una variable temporal s 2) Sustituir las asignaciones a ji por ji:=s i [1..n]
3) Para toda asignacin i:=i+n en el bucle hacer aadir a continuacin s := s + c*n /* c*n cte.*/ poner s en Familia(i) /* triple (i,c,d) */ 4) Poner la incializacin de s al final del preencabezamiento: s := c*i /* solo s:=i si c es 1 */ s := s+d /* omitir si d es 0 */
s1 := 2 * i s2 := 2 * i s2 := s2 + 5 s3 := 6 * i s3 := s3 + 15 s4 := 6 * i s4 := s4 + 21
(0)
27
28
Salida Bucle revisado Mtodo 0) Eliminar variables de induccin sin usos en el Bucle y fuera de l. (slo su propia definicin o instruc. copia) 1) Para toda variable de induccin i que se usa slo para calcular vbles. de induc. en su familia y saltos condic. hacer Elegir una j Familia(i) /* con triple (i,c,d) lo ms simple */ Modificar cada comprobacin en que aparezca i para utilizar j Ej.: if i oprel x goto B , x vble. inducc se sustituye por: r := c*x /* r := x si c es 1 */ r := r+d /* se omite si d es 0*/ if j oprel r goto B /* r temporal */ finpara para toda vble de induccin eliminada del bucle hacer borrar todas sus asignaciones finpara 2) Para toda vble de inducc. j para la que el alg. De reduccin de intensidad en v.i. introdujo una proposicin j := s hacer a) Comprobar que no se define s entre j:=s y cualquier uso de j b) Sustituir usos de j por usos de s c) Borrar j:=s Finpara
29
30
s2 := 2 * i s2 := s2 + 5 s4 := 6 * i s4 := s4 + 21 (0) i := i + 3 s4 := s4 + 18 s2 := s2 + 6 (2) j := s2 (3) k := s4 (5) m := a[j] (6) a[k] := m (7) if i < N goto (0)
Ejemplo
Var a: array [0..9, 0..9, 0..9] of integer; b: array [0..9, 0..9] of integer; for j := 0 to 9 do for k := 0 to 9 do b[5, k ] := b[5, k] + a[5, j, k] ; (Las variables j, y k no estn activas a la salida)
B1
B7
L1:
L2:
s2 := 2 * i s2 := s2 + 5 s4 := 6 * i s4 := s4 + 21 t := 2 * N t := t + 5
L4: L3:
t1 := 0 j := t1 t2 := 9 if j > t2 goto L3 t3 := 0 k := t3 t4 := 9 if k > t4 goto L4 t5 := 5 t6 := 10 * t5 t7 := t6 + k t8 := t7 * 2 t9 := b[t8] t10:= 5 t11:= 10 * t10 t12:= t11 + j t13:= t12 * 10 t14:= t13 + k t15:= t14 * 2 t16:= a[t15] t17:= t9 + t16 t18:= 5 t19:= 10 * t18 t20:= t19 + k t21:= t20 * 2 b[t21]:= t17 k := k + 1 goto L2 j := j + 1 goto L1
B2
B3
t3 := 0 k := t3 t4 := 9
B4
if k > t4 goto B6
B6
B5
t5 := 5 t6 := 10 * t5 t7 := t6 + k t8 := t7 * 2 t9 := b[t8] t10 := 5 t11 := 10 * t10 t12 := t11 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 t18 := 5 t19 := 10 * t18 t20 := t19 + k t21 := t20 * 2 b[t21] := t17 k := k + 1 goto B4
j := j + 1 goto B2
31
32
rbol de dominacin:
B1
B2
B3
B7
B4
B5
B6
Aristas de retroceso B6 B2 y B5 B4 Bucle natural interno: { B4, B5 } Bucle natural externo: { B2, B3, B4, B5, B6 } GDA asociado al bloque B5 :
t7 := 50 + k t8 := t7 * 2 t9 := b[t8] t12 := 50 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 b[t8] := t17 k := k + 1 goto B4
b 10
t13
+ k
t12
k0
t5 := 5 t6 := 10 * t5 t7 := t6 + k t8 := t7 * 2 t9 := b[t8] t10 := 5 t11 := 10 * t10 t12 := t11 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 t18 := 5 t19 := 10 * t18 t20 := t19 + k t21 := t20 * 2 b[t21] := t17 k := k + 1 goto B4
[]
t14
t13
+ k
t12
10
k0
33
34
B1
j := 0 t2 := 9
B7
B1
j := 0 t2 := 9
B7
B2
B2
B3
k := 0 t4 := 9
B3
k := 0 t4 := 9
B4
Pre_Int
if k > t4 goto B6
B6
B4
if k > t4 goto B6
B6
B5
t7 := 50 + k t8 := t7 * 2 t9 := b[t8] t12 := 50 + j t13 := t12 * 10 t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 b[t8] := t17 k := k + 1 goto B4
j := j + 1 goto B2
B5
j := j + 1 goto B2 t7 := 50 + k t8 := t7 * 2 t9 := b[t8] t14 := t13 + k t15 := t14 * 2 t16 := a[t15] t17 := t9 + t16 b[t8] := t17 k := k + 1 goto B4
Variable de induccin bsica del bucle interno Familia(k) t7 (k, 1, 50), t8 (k, 2, 100), t14 (k, 1, t13) y t15 (k, 2, 2*t13).
k (k, 1, 0)
35
36
B1
j := 0 t2 := 9
B7
B1
j := 0 t2 := 9
B7
B2
B2
B3
B3
Pre_Int
t12 := 50 + j t13 := t12 * 10 s7 := k + 50 s8 := k * 2 s8 := s8 + 100 s14 := k + t13 s15 := 2 * k t20 := 2 * t13 s15 := s15 + t20
Pre_Int
s8 := k * 2 s8 := s8 + 100 s15 := 2 * k t20 := 2 * t13 s15 := s15 + t20 t21 := t4 * 2 t22 := t21 + 100
B4
B4
if k > t4 goto B6
B6 B5
t7 := s7 t8 := s8 t9 := b[t8] t14 := s14 t15 := s15 t16 := a[t15] t17 := t9 + t16 b[t8] := t17 k := k + 1 s15 := s15 + 2 s14 := s14 +1 s8 := s8 + 2 s7 := s7 + 1 goto B4
j := j + 1 goto B2
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
j := j + 1 goto B2
37
38
B1
j := 0 t2 := 9
B7
B1
j := 0 t2 := 9
B7
B2
Pre_Ext
t22 := 118
SIG
B2
B3
if j > t2 goto B7
B3
B4
B4
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
j := j + 1 goto B2
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
j := j + 1 goto B2
Bucle externo (B2, B3, B4, B5 y B6). Instrucciones invariantes s8:=100 (no extra !le) y t22:=118, "aria!le #e in#ucci$n !%sica #el !ucle externo 'a(ilia(&) t12 (&, 1, 50), y t13(&,10,500). (&,1,0)
39
40
B1
j := 0 t2 := 9
B7
B1
j := 0 t2 := 9 t22 := 118 s13:= 10*j s13:= s13+500 r:= t2*10 r:= r+500
B7
Pre_Ext
Pre_Ext
SIG
SIG
B2
if j > t2 goto B7
B2
B3
B3
B4
B4
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
41
42
B1
B7
SIG
B2
Nombre de archivo: 9-optim11.doc Directorio: G:\Papa\My Dropbox\PDL\Transparencias Plantilla: C:\Users\Papa\AppData\Roaming\Microsoft\Plantillas\Normal.dotm Ttulo: Eliminacin de asignaciones inactivas (intiles , inservibles) Asunto: Autor: Dana Palabras clave: Comentarios: Fecha de creacin: 22/04/2012 22:35:00 Cambio nmero: 2 Guardado el: 22/04/2012 22:35:00 Guardado por: Papa Tiempo de edicin: 0 minutos Impreso el: 22/04/2012 22:35:00 ltima impresin completa Nmero de pginas: 43 Nmero de palabras: 2.383 (aprox.) Nmero de caracteres:13.110 (aprox.)
B3
B4
t9 := b[s8] t16 := a[s15] t17 := t9 + t16 b[s8] := t17 s15 := s15 + 2 s8 := s8 + 2 goto B4
43