Está en la página 1de 50

Optimizacin de cdigo

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin de Cdigo
Introduccin, criterios Tipos: independiente/dependiente, local/global Optimizacin independiente de la mquina
Transformaciones del cdigo Anlisis de flujo de control Tratamiento de bucles Introduccin al anlisis de flujo de datos y optimizacin global

Optimizacin dependiente de la mquina


Optimizacin de mirilla Asignacin de registros
2

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin de Cdigo
Fase cara y difcil Hay que establecer criterios para que no sea ms costosa que la propia ejecucin (aunque puede justificarse si se va a ejecutar el mismo programa muchas veces) Criterios para las transformaciones
Las transformaciones deben preservar el significado de los programas Una transformacin debe acelerar los programas en una cantidad mensurable Una transformacin debe valer la pena
3

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin de Cdigo
Obtener cdigo que se ejecuta mas eficientemente segn los criterios de:
Tiempo de ejecucin (optimizacin temporal) Espacio de memoria utilizado (optimizacin espacial)

Dnde? Cmo? Cunto?

Optimizacin de Cdigo. Procesadores de Lenguaje II

Generacin de cdigo y optimizacin


Dnde?
Generacin de cdigo
Mientras se analiza el programa Libre del contexto

Optimizacin de cdigo
Despus de la generacin de cdigo de todo el programa o de un elemento ejecutable de este (funcin, procedimiento, etc.) Dependiente del contexto

Regla 90/10
En general el 90% del tiempo de ejecucin de un programa es consumido por el 10% del cdigo La optimizacin debe ser aplicada sobre ese 10%. Estimacin conservadora del comportamiento del programa
5

Optimizacin de Cdigo. Procesadores de Lenguaje II

Funcionamiento
Cmo?
Revisa el cdigo generado a varios niveles de abstraccin y aplica transformaciones segn nivel de abstraccin Representaciones de cdigo intermedio de ms a menos abstractas rbol sintctico abstracto
Optimizar subexpresiones redundantes, eliminar cdigo inalcanzable, reduccin de coste, etc.

Tuplas o cuadruplas
Optimizar el uso de registros o de las variables temporales

Ensamblador/Cdigo mquina
Convertir saltos a saltos cortos Reordenar instrucciones de cdigo mquina Utilizar instrucciones especficas

Utilizacin de estructuras de datos ad hoc


Grafos de flujo de ejecucin, grficos dirigidos acclicos
6

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reglas de oro de la optimizacin


Cunto?
La optimizacin prematura es la raz de todo mal Donald Knuth
Puede introducir errores nuevos y sutiles Hace el cdigo ms difcil de entender y mantener

Regla de oro
Mantener el cdigo correcto, despus si es realmente necesario entonces optimizarlo

La mejor y ms importante forma de optimizar un programa es usando buenos algoritmos


Por ejemplo: O(n*log) en lugar de O(n2) Cuidado: la complejidad asinttica no siempre es una mtrica adecuada.
7

Optimizacin de Cdigo. Procesadores de Lenguaje II

Tipos de optimizacin
Momento de la compilacin
Independiente de mquina Dependiente de mquina
Transformaciones en cdigo intermedio: Reduccin de coste, expresiones comunes, propagacin de constantes, Asignacin de registros Ordenacin/seleccin de instrucciones

rea del programa donde se aplica


1. Local
Reduccin de potencia Folding Propagacin de constantes

2. Global

Anlisis del grafo del flujo de control. Bucles


Reduccin de frecuencia y potencia

3. Interprocedural La mayora de compiladores hacen (1), muchos (2) y pocos (3)

Anlisis del grafo del flujo de datos. Extensin de transformaciones

Optimizacin de Cdigo. Procesadores de Lenguaje II

Fases de la optimizacin
Cadena de caracteres Cadena de tokens rbol sintctico rbol de sintaxis abstracta con anotaciones

Cambiar Algoritmos Mejorar bucles Hacer perfiles de rendimiento Scanner Parser Anlisis Semntico Generacin de Cdigo intermedio Eliminacin Local de Redundancias Eliminacin Global de Redundancias Mejora de bucles Generacin de Cdigo final Ordenacin de Intrucciones Prelimiar Seleccin de registros Ordenacin de instrucciones final y/o seleccin Optimizacin de mirilla 9

Front End

Independiente

Grafo de flujo de control con pseudoinstruciones en bloques bsicos Grafo del flujo de control modificado Grafo del flujo de control modificado Grafo del flujo de control modificado Lenguaje casi ensamblador

Back End

Dependiente

Lenguaje ensamblador modificado Lenguaje ensamblador modificado Lenguaje ensamblador modificado Lenguaje ensamblador final

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin Independiente
Transformaciones sobre el cdigo intermedio
Simplificaciones algebraicas Eliminar cdigo inalcanzable Folding Reduccin de subexpresiones comunes Propagacin de copias y constantes

La optimizacin local se aplica primero sobre los bloques bsicos


Fragmento de cdigo con una nica entrada y salida y las instrucciones se ejecutan secuencialmente
Si se ejecuta una instruccin del bloque entonces se ejecutan todas en un orden conocido en tiempo de compilacin
10

Optimizacin de Cdigo. Procesadores de Lenguaje II

Grafos de Flujo y Bloques Bsicos


Grafo de Flujo
Grafo dirigido que representa el flujo de control

x := 1 i := 1

Bloque Bsico
Nodo de un grafo de flujo Secuencia de sentencias consecutivas. El flujo de control lo recorre de principio a fin

Arcos: saltos entre bloques Mtodo de divisin


Buscar sentencias lder
Primera sentencia Sentencia origen de cualquier salto Cualquier sentencia a continuacin de cualquier salto

L: x := x * x i := i + 1 if i < 10 goto L

Bloque bsico: instrucciones entre sentencias lder

11

Optimizacin de Cdigo. Procesadores de Lenguaje II

Tratamiento Bloque Bsico


Ejemplo: el bloque bsico
1. 2. 3. 4.

L: t := 2 * x w := t + x if w > 0 goto L

(3) nunca puede ser ejecutada sin haberse ejecutado (2) antes
(3) podra cambiarse a w := 3 * x Podra elminarse (2)?

12

Optimizacin de Cdigo. Procesadores de Lenguaje II

Bloque Bsico
Ejemplo:
for (i=1;i<10;++i) { b=b+a[i]; c=b*i; } a=3; b=4; goto l1; c=10; l1: d=3; e=4; for (i=1;i<10;++i) { b=b+a[i]; c=b*i; } a=3; b=4; goto l1; c=10; l1: d=3; e=4;

INCORRECTO

CORRECTO
13

Optimizacin de Cdigo. Procesadores de Lenguaje II

Simplificacin Algebraica
Algunas sentencias pueden eliminarse
x := x + 0 x := x * 1

Algunas sentencias pueden simplificarse


x := x * 0 y := y ** 2 x := x * 8 x := x * 15 (en muchas mquinas x := 0 y := y * y x := x << 3 t := x << 4; x := t - x << es ms rpido que *)

14

Optimizacin de Cdigo. Procesadores de Lenguaje II

Eliminar cdigo inalcanzable


Cdigo no alcanzable en el grafo de flujo de control
Bloques bsicos que no son destino de ningn salto: pueden eliminarse

Ej.:
if (DEBUG) { printf() }

Reduccin del tamao del programa

15

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ensamblamiento (Constant Folding)


Remplazar las expresiones por su resultado cuando se pueden evaluar en tiempo de compilacin (resultado constante).
Ejemplo: A=2+3+A+C -> A=5+A+C if 2 < 0 jump L -> puede borrarse

Extensin: usar propiedades conmutativa y asociativa.


Ejemplo: aplicando la propiedad conmutativa se reduce
A=B+2+C+3 : A=B+C+5

16

Optimizacin de Cdigo. Procesadores de Lenguaje II

Implementacin del Ensamblamiento


Implementacin durante el anlisis sintctico/semntico
Se aade el atributo de constante temporal a los smbolos no terminales y a las variables de la tabla de smbolos Se aade el procesamiento de las constantes a las reglas de anlisis de expresiones

Implementacin posterior (rep. intermedia)


Buscar partes del rbol donde se puede aplicar la propiedad conmutativa Buscar las constantes, operarlas y propagarlas x := y op z y , z son constantes: x se calcula en tiempo de compilacin

17

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de Ensamblamiento
Expresin: rbol:
+ 3 5 + 6 -4 A * 10
18

3-(5+6)+4-A*10
*

10

Resultado: -4-(A*10)

Optimizacin de Cdigo. Procesadores de Lenguaje II

Eliminacin de subexpresiones redundantes


Las subexpresiones que aparecen ms de una vez se calculan una sola vez y se reutiliza el resultado Ejemplo:
x := y + z x := y + z w := y + z w := x (los valores de x, y, z no cambian en )

Mtodo:
Detectar las subexpresiones iguales y que las compartan diversas ramas del rbol Trabajar con un grafo acclico dirigido (DAG)
19

Optimizacin de Cdigo. Procesadores de Lenguaje II

Grafos Dirigidos Acclicos


DAG: Grafo que representa un bloque bsico
Estructura de datos que recoge clculos y reasignaciones Hojas: variables o constantes (datos de entrada) Nodos: operadores Etiquetas: identificadores resultado de los operadores B1 t3 > t1, fa
fa *

Ejemplo: bloque B2:

read x fa := 1

t2, x
x

1 0

Construccin:

Tabla de constantes y variables Funcion diccionario: nodo(id) Funcin diccionario: nodo(op, id1, id2) Listas de etiquetas de cada nodo

B2 L:label L t1 := fa * x fa :=t1 t2 :=x-1 x :=t2 t3 :=x>0 iff t3 goto L B3 write fa

20

Optimizacin de Cdigo. Procesadores de Lenguaje II

Grafos Dirigidos Acclicos


Construccin (cont.):
Para cada sentencia s en B si s es x = y op z
1.

2.

si nodo(y) est vaco, crear hoja y asignar y a nodo(y). Lo mismo para nodo(z) N=buscar nodo(op,y,z). Si no hay, crearlo nuevo si nodo (y) est vaco, crear hoja y asignar y a nodo(y) N=nodo(y)

si s es x = y
1.

B2 L:label L t1 := fa * x fa :=t1 t2 :=x-1 x :=t2 t3 :=x>0 iff t3 goto L

2.

borrar x de la lista de nodo(x) y asignar a N t1, fa


fa *

t3 > t2, x
x 1 0
21

Optimizacin de Cdigo. Procesadores de Lenguaje II

Grafos Dirigidos Acclicos


Utilizacin de DAGs
t3 > t1, fa
fa *

Recorrido topolgico del grafo para reconstruir el bloque


fa := fa * x t1 :=fa x :=x-1 t2 :=x t3 :=x>0 t3, x
*

x=(x+1)*(x+1) t1=x+1 t2=x+1 t3=t1*t2 x=t3

t2, x
x

1 0

t1, t2 +
x 1 t1=x+1 t2=t1 x=t1*t1 t3=x

Cuestiones de reconstruccin

Informacin adicional: variables utilizadas en el bloque cuantas referencias de cada valor sentencias cuya asignacin puede usarse fuera del bloque

mejor orden de recorrido del grafo variables redundantes

22

Optimizacin de Cdigo. Procesadores de Lenguaje II

Eliminacin de subexpresiones redundantes. Extensin


Dos expresiones pueden ser equivalentes y no escribirse de la misma forma Para comparar dos expresiones se utiliza la forma normal Se ordenan los operandos Ejemplo:
A+B es equivalente a B+A

Primero las constantes, despus variables ordenadas alfabticamente, las variables indexadas y las subexpresiones
X = C+3+A+5 Y = 2+A+4+C

divisiones y restas se ponen como sumas y productos para poder conmutar

X = 3+5+A+C Y = 2+4+A+C

A+(-B) A/B A*(1/B)


A-B

23

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin de copias y constantes


Cuando w := x aparece en un bloque, los usos siguientes de w se reemplazan por x:
b := z + y a := b x := 2 * a b := z + y a := b x := 2 * b

Extenxin: variables indexadas

Se asocian constantes a expresiones de acceso a variables indexadas. Ejemplo

A[i]=10 Se asocia 10 a A[i] aun no sabiendo el valor de i. En el caso de hacer una asignacin a cualquier elemento de A se deshace la asociacin.

Aparentemente no mejora el programa, pero permite aplicar otras optimizaciones en cascada:


Constant folding Eliminacin de cdigo inalcanzable

24

Optimizacin de Cdigo. Procesadores de Lenguaje II

Extensiones
Problema
Extender la propagacin fuera de bloques bsicos Hay que realizar un anlisis del flujo de datos (optimizacin global) y es complejo Ejemplo:
i=0; loop: i=i+1 if (i<10) goto loop;

Podra transformarse errneamente en


i=0; loop: i=1 if (1<10) goto loop

25

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin de copias y Folding


Desde que se asigna a una variable un valor constante hasta la siguiente asignacin, se considera a la variable equivalente a la constante
Estas optimizaciones permiten que el programador utilice nombres para las constantes sin introducir ineficiencias Ejemplo: Propagacin Ensamblamiento

G2R=PI/180
PI=3.14

PI=3.14 G2R=3.14/180

PI y G2R se consideran constantes hasta la prxima asignacin.

PI=3.14 G2R=0.017

Ejemplo:

a := 5 x := 2 * a y := x + 6 t := x * y

a := 5 x := 10 y := 16 t := x << 4
26

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin de copias y cdigo inalcanzable


Eliminar instrucciones no alcanzables tras propagar una constante
#define DEBUG 0 if (DEBUG) { print depuracion}

t1=DEBUG==1 iff t1 goto L2 L1: print depuracion L2:

t1=0 goto L2 L1: print depuracion L2:

27

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin de copias y cdigo inalcanzable


Eliminar instrucciones que asignan valores no utilizados Si
w := valor est en un bloque bsico w no aparece en ningn otro sitio del programa

Entonces
La sentencia w := valor est muerta y puede eliminarse: no es parte del resultado del programa

Ejemplo: (a no se usa ms)


x := z + y a := x x := 2 * a b := z + y a := b x := 2 * b b := z + y x := 2 * b

28

Optimizacin de Cdigo. Procesadores de Lenguaje II

Aplicacin de optimizaciones locales


Cada optimizacin hace poco por s misma
Tpicamente una transformacin permite la aplicacin de otras sucesivas: problema de fase Pueden aplicarse iterativamente hasta que no hay ms mejora, o se alcanza un tiempo lmite

29

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Cdigo inicial:
a := x ** 2 b := 3 c := x d := c * c e := b * 2 f := a + d g := e * f

30

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Optimizacin algebraica:
a := x ** 2 b := 3 c := x d := c * c e := b * 2 f := a + d g := e * f

31

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Optimizacin algebraica :
a := x * x b := 3 c := x d := c * c e := b << 1 f := a + d g := e * f

32

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Propagacin de copia:
a := x * x b := 3 c := x d := c * c e := b << 1 f := a + d g := e * f

33

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Propagacin de copia:
a := x * x b := 3 c := x d := x * x e := 3 << 1 f := a + d g := e * f

34

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Constant folding:
a := x * x b := 3 c := x d := x * x e := 3 << 1 f := a + d g := e * f

35

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Constant folding:
a := x * x b := 3 c := x d := x * x e := 6 f := a + d g := e * f

36

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Eliminar subexpresin comn:
a := x * x b := 3 c := x d := x * x e := 6 f := a + d g := e * f

37

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Eliminar subexpresin comn:
a := x * x b := 3 c := x d := a e := 6 f := a + d g := e * f

38

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Propagacin de copia:
a := x * x b := 3 c := x d := a e := 6 f := a + d g := e * f

39

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Propagacin de copia:
a := x * x b := 3 c := x d := a e := 6 f := a + a g := 6 * f

40

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Eliminacin de cdigo inalcanzable:
a := x * x b := 3 c := x d := a e := 6 f := a + a g := 6 * f

41

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de secuencia de optimizaciones


Eliminacin de cdigo inalcanzable:
a := x * x

f := a + a g := 6 * f

Resultado final

42

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin local mediante mirilla


mirilla secuencia corta de instrucciones objeto Sustituir la mirilla por otras instrucciones ms rpidas o cortas
t1=a-b t2=t1+c d=t2
MOV a, R0 SUB b, R0 MOV R0, t1 MOV t1, R0 ADD c, R0 MOV R0, t2 MOV t2, d MOV a, R0 SUB b, R0

Se pueden quitar Se puede quitar t2

ADD c, R0 MOV R0, d

Se puede aplicar tanto al cdigo intermedio como al cdigo objeto En general, se plantea con un conjunto de reglas de reemplazamiento i1, , in j1, , jm Cada mejora puede brindar oportunidades para mejoras adicionales
43

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin local mediante mirilla


Cargas y almacenamientos redundantes
(1) MOV R0,a (2) MOV a, R0 Se elimina (2) ya que est garantizado que con (1) el valor de a est en el registro R0 (siempre que no haya saltos a (2))

Cdigo inalcanzable
Se puede eliminar una instruccin sin etiqueta que siga inmediatamente a un salto incondicional

Optimizaciones del flujo de control


Saltos hacia saltos, saltos hacia saltos condicionales y saltos condicionales hacia saltos
goto L1 L1:goto L2 goto L2 L1:goto L2 goto L1 L1: if a<b goto L2 L3: if a<b goto L2 goto L3 L3:
44

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin local mediante mirilla


Eliminacin de instrucciones intiles
a=a*1 b=b+0

Utilizacin de instrucciones especficas (machine idioms)


a=a+1

inc a

Reacondicionamiento de instrucciones Antes Despus


a:=b*c*(d+e) t1=b*c t2=d+e t3=t1*t2 LOAD MUL STA LOAD ADD MUL STA B C T1 D E T1 A a:=(d+e)*b*c t1:=d+e t2:=b*c t3:=t2*c LOAD ADD MUL MUL STA D E B C A

45

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizaciones Dentro de Bucles


La optimizacin de bucles es muy importante por las mejoras en tiempo de ejecucin que se obtienen
Localizar bucles: en algunos lenguajes trivial, en otros por anlisis del grafo de flujo

Estrategias de optimizacin dentro de bucles (perspectiva local o global)


Expansin de bucles (loop unrolling) Reduccin de frecuencia (frequency reduction) Reduccin de potencia (strength reduction)
46

Optimizacin de Cdigo. Procesadores de Lenguaje II

Expansin de bucles (loop unrolling)


Solo se puede aplicar a los bucles cuyo nmero de iteraciones se conoce en tiempo de compilacin
Ejemplo:
Se puede aplicar a los bucles for i=1 to 10 do No se puede aplicar a los bucles for i=a to b do

For (I=0; I < 4; I++) a(I) = 0;

A(0) A(1) A(2) A(3)

= = = =

0; 0; 0; 0;

La expansin de un bucle puede ser muy costosa en espacio Hay que poner un criterio heurstico para decidir si se aplica la expansin
47

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin global de bucles


Bsqueda de bucles: en general con el grafo de flujo
Dominacin: d dom n si todo camino desde el inicio para llegar a n pasa por d
1 2 4 5 1 2 4 5
48

rbol de dominacin
No ms de 1 dominador inmediato por nodo
3

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin global de bucles


Bucles: en arcos donde origen domina al destino
Ej.:
1 2 4 5 3 1 2 4 5 3

Arcos con bucle: 3->1, 4->1, 5->1

Bucle natural de o->d: camino desde d que permite llegar a n


1->3 1->2->4 1->2->4->5 Bucle interno: no contiene ningn otro
49

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de frecuencia (frequency reduction)


Detecta las operaciones invariantes de bucle y las calcula una nica vez delante del bucle Invariante en bucle L:
una sentencia x:=y op z donde las definiciones de y, z estn fuera de L Una sentencia v:=x op w donde w se define fuera de L y x se define en una sentencia invariante

Las invariantes pueden moverse a la cabecera de L

50

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de frecuencia (frequency reduction)


Ejemplo:
for i=1 to n do c=i*sin(a);
i:=1 L1: t1:=sin(a) t2:=i*t1 c:=t2; i:=i+1 if i<n goto L1

sin(a) es una operacin invariante del bucle que puede pasar de sin(a) calcularse de n veces a una:
i:=1 t1:=sin(a) L1: t2:=i*t1 c:=t2; i:=i+1 if i<n goto L1
51

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de frecuencia (frequency reduction)


Slo las operaciones que cumplen
Su nico efecto es el clculo del resultado El resultado solo depende de los operandos

se pueden considerar como operaciones invariantes de bucle. Ejemplo:


Invariantes: +. -, *, / , sin, ln No invariantes: printf, getchar, ++, random

52

Optimizacin de Cdigo. Procesadores de Lenguaje II

Implementacin de la Reduccin de Frecuencia


Pasos
Detectar todas las variables que se modifican en el bucle Marcar todas las operaciones no invariantes Aplicar la siguiente regla recursiva para detectar las operaciones invariantes
Una operacin es invariante si sus operandos son invariantes

Asociar a cada expresin invariante una variable temporal Sustituir en el bucle las operaciones invariantes por las correspondientes variables Aadir delante del bucle la asignacin de la expresin invariante a su variable temporal

Extensin
Cuando no se entra en el bucle se calculan sus operaciones invariantes. La solucin es evaluar antes la condicin de salida del bucle
53

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de potencia (strength reduction)


Sustituir productos entre variables inductivas e invariantes de bucle por sumas
for(i=1; i<10;++i) a[i]=3*i;

convertir en
for(i=1,j=3;i<10;++i,j+=3) a[i]=j;

Problemas a resolver
Detectar las invariantes de bucle (ya esta solucionado) Detectar las variables inductivas y relacionadas
i:=i+k i es variable de induccin bsica (k invariante) j:=c*i+d j est en la familia de i (c,d invariantes)
54

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de potencia (strength reduction)


Reducir el coste de las operaciones sobre variables inductivas Dada variable inductiva v:=v+k Para cada variable j en la familia: j:=c*v+d
Crear variable nueva s Reemplazar c*v+d en asignacin a j por j:=s Se inicializa s despus de la inicializacin de v (solo se ejecuta al entrar en el bucle)
s=c*v s:=s+d Se inicializa la constante de incremento de s: T=k*c

Al final de cada iteracin se aade s=s+T


55

Optimizacin de Cdigo. Procesadores de Lenguaje II

Reduccin de potencia (strength reduction)


Ejemplo
B1 i := 1 B2 L:label L i := i+2 t1 :=4*i t2 :=a[t1] iff t2<v goto L B1 i := 1 s := 4*i t3:=4*2 B2 L:label L i := i+2 s:=s+t3 t1 :=s t2 :=a[t1] iff t2<v goto L

56

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin Global
Grafo del flujo de ejecucin
Antes de realizar una optimizacin global es necesario crear el grafo de flujo de ejecucin El grafo de flujo de ejecucin representa todos los caminos posibles de ejecucin del programa La informacin contenida en el grafo es til para
el programador el optimizador

57

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin Global
La optimizacin global a partir del anlisis del flujo de datos permite:
Una propagacin de constantes fuera del bloque bsico. Eliminacin del cdigo no utilizado Una mejor asignacin de los registros.

Problema: la optimizacin global es muy costosa en tiempo de compilacin

58

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin Global
Parte de la construccin del grafo de flujo de ejecucin Ejemplo
int fact(int n) { int r;
r=1; i=1; while (i<=n) { r=r*i; ++i; } return r;
r=1 i=1 while (i<=n) bloque bsico bloque bsico

bloque bsico r=r*i; ++i;

bloque bsico

return r;

59

Optimizacin de Cdigo. Procesadores de Lenguaje II

Aplicaciones del anlisis del flujo de datos


Hay que considerar como la informacin sobre las variables y expresiones se propaga a travs del grafo Problemas resueltos durante el anlisis del grafo
Deteccin de cdigo no utilizado Expresiones disponibles (al seguir la ejecucin sigue siendo vlido el resultado obtenido) Alcance de las definiciones
Eliminar expresiones redundantes Reutilizar las copias en registro de los valores de las variables. Propagacin de constantes Reduccin de frecuencia Reutilizar el espacio de variables. Eliminar variables innecesarias Optimizar la asignacin de registros El cdigo no utilizado son los bloques bsicos donde no llega ninguna arista.

Variables vivas

Expresiones muy utilizadas

60

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de Optimizacin Global


Optimizacin local dentro de bloques:
Propagacin de constantes Eliminacin de cdigo inalcanzable

X := 3 Y := Z * W Q := X + Y

X := 3 Y := Z * W Q := 3 + Y Y := Z * W Q := 3 + Y

61

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo de Optimizacin Global


Extensin a todo el grafo de flujo de control:
X := 3 B>0 Y := Z + W Y := 0 X := 3 B>0 Y := Z + W X := 4 A := 2 * 3 A := 2 * 4 Y := 0

Correcto

Incorrecto
62

Optimizacin de Cdigo. Procesadores de Lenguaje II

Problema del Anlisis Global del Flujo de Datos


Como saber cuando pueden propagarse constantes?
Para cada camino que use x, la ltima asignacin a x sera x := k
Implica considerar todos los caminos a travs de bifurcaciones condicionales: anlisis global

Caractersticas comunes de las tcnicas globales


Dependen de conocer una propiedad de X en un punto particular en la ejecucin del programa Probar X en cualquier punto requiere conocimiento de todo el grafo Criterio conservador. Si se precisa que X sea cierto:
X es siempre cierto No se sabe si X es cierto

Es seguro manejar el estado desconocido


63

Optimizacin de Cdigo. Procesadores de Lenguaje II

Problema del Anlisis Global del Flujo de Datos


Anlisis Global de Flujo de Datos tcnica general de
resolucin de problemas con estas propiedades
Planteamiento:
Puntos en el grafo de flujo: entre sentencias consecutivas de cada bloque bsico Definiciones y alcance:
Definicin de x, d: sentencia que asigna o puede asignar un valor a x Alcance: la definicin d alcanza el punto p si hay un camino de d a p sin que d se elimine (se redefina)

sistemas de ecuaciones de flujo de datos


out[S]=gen[S] U (in[S] kill[S])

Ejemplos de anlisis de flujo de datos


Propagacin global de constantes: anlisis hacia adelante Anlisis global de variables vivas: anlisis hacia atrs
64

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin Global de Constantes


Puede realizarse en cualquier punto donde se mantiene la propiedad c para la variable x:

valor
# c *

interpretacin
Sentencia no alcanzable x = constante c Desconocido si x es constante
65

Optimizacin de Cdigo. Procesadores de Lenguaje II

Propagacin Global de Constantes. Ejemplo


X := 3

X=3 X=3
Y := Z + W X := 4

B>0

X=* X=3 X=3


Y := 0

X=4

A := 2 * X

X=* X=*

X=3

66

Optimizacin de Cdigo. Procesadores de Lenguaje II

Uso de la Informacin
Una vez calculada la informacin global de constantes para x, optimizacin:
En cada punto donde x tenga la etiqueta c, se puede reemplazar por la constante

Clculo de las propiedades de x = ?


Anlisis a travs de reglas relacionando las ecuaciones en puntos consecutivos. Mtodos iterativos Para cada sentencia s, calcular informacin de x antes y despus de s (transferir informacin) Cin(x,s) = valor de x antes de s Cout(x,s) = valor de x despus de s

67

Optimizacin de Cdigo. Procesadores de Lenguaje II

Funciones de Transferencia
Suponiendo que la sentencia s tiene como predecesoras p1,,pn
Reglas de entrada: Cin(x,s). Combinan informacin de entrada de varios arcos del grafo de flujo de control
X=? X=?
s

X=*

X=? X=*

Reglas de salida: Cout(x,s). Propagan informacin a lo largo de las sentencias


X=# X=#
68

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cin(x,s). Regla 1


X=? X=? X=* X=? X=*

if Cout(x, pi) = * for some i, then Cin(x, s) = *

69

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cin(x,s). Regla 2


X=c X=? X=d X=? X=*

If Cout(x, pi) = c and Cout(x, pj) = d and d c then Cin (x, s) = *


70

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cin(x,s). Regla 3


X=c X=# X=c X=# X=c

if Cout(x, pi) = c or # for all i, then Cin(x, s) = c


71

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cin(x,s). Regla 4


X=# X=# X=# X=# X=#

if Cout(x, pi) = # for all i, then Cin(x, s) = #


72

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cout(x,s). Regla 5


X=#

s
X=#

Cout(x, s) = # if Cin(x, s) = #

73

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cout(x,s). Regla 6


X=?

x := c
X=c

Cout(x, x := c) = c if c is a constant

74

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cout(x,s). Regla 7


X=?

x := f()
X=*

Cout(x, x := f()) = *

75

Optimizacin de Cdigo. Procesadores de Lenguaje II

Clculo de Cout(x,s). Regla 8


X=a

y := . . .
X=a

Cout(x, y := ) = Cin(x, y := ) if x y

76

Optimizacin de Cdigo. Procesadores de Lenguaje II

Un Algoritmo
1. Para cada sentencia s de entrada al programa, Cin(x, s)
:= * 2. En el resto: Cin(x, s) := Cout(x, s) := # 3. Repetir

Tomar sentencia s que no cumpla 1-8 y aplicar la regla apropiada

Hasta que todos los puntos satisfagan las reglas o no cambia A causa de los ciclos, valores iniciales en todos los puntos El valor inicial # inicializa a no alcanzable cada punto (condicin de partida) Garantizar fin: limitar nmero mximo de cambios
77

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo 1
X := 3

X=# 3
Y := Z + W

B>0

X=* X=# 3 X=# 3


Y := 0

X=# 3
A := 2 * X A<B

X=# 3

X=# 3 X=# 3

Finaliza cuando todas las reglas se cumplen


78

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo 2
X := 3 B>0 Y := Z + W Y := 0

A := 2 * X X := 4 A<B

79

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo 2
X := 3

X=# 3
Y := Z + W

B>0

X=* X=# 3 X=# 3


Y := 0

X=# 3
A := 2 * X X := 4 if A < B

X=# 4 *

X=# 3 * X=# 3 * X=# 4 *

Finaliza cuando todas las reglas se cumplen


80

Optimizacin de Cdigo. Procesadores de Lenguaje II

Anlisis Global de variables vivas


Despus de propagar constantes, eliminar cdigo inalcanzable
X := 3 B>0 Y := Z + W A := 2 * X Y := 0

Despus de propagar constantes, X := 3 , la variable X est muerta (si es el grafo de control de flujo)
81

Optimizacin de Cdigo. Procesadores de Lenguaje II

Variables vivas
La variable x est viva en la sentencia s si
Hay una sentencia s que usa x Hay camino de s a s sin asignaciones a x

Una sentencia x :=y op z iest muerta si x est muerta despus de asignacin


Puede borrarse del programa

Esta propiedad puede expresarse como informacin transferida entre sentencias adyacentes
Ms simple que propagacin de constantes: true or false
82

Optimizacin de Cdigo. Procesadores de Lenguaje II

Variables vivas. Regla 1


p

X = true

X=?

X=?

X = true

X=?

Lout(x, p) = { Lin(x, s) | s es un sucesor de p }

83

Optimizacin de Cdigo. Procesadores de Lenguaje II

Variables vivas. Regla 2


X = true

:= x +
X=?

Lin(x, s) = true si s hace referencia a x en su lado derecho


84

Optimizacin de Cdigo. Procesadores de Lenguaje II

Variables vivas. Regla 3


X = false

x := e
X=?

Lin(x, x := e) = false si e no es x

85

Optimizacin de Cdigo. Procesadores de Lenguaje II

Variables vivas. Regla 4


X=a

s
X=a

Lin(x, s) = Lout(x, s) si s no se refiere a x

86

Optimizacin de Cdigo. Procesadores de Lenguaje II

Algoritmo
1. Asignar L() := false inicialmente 2. Repetir hasta que todas las variables s satisfacen reglas
1-4
Tomar s donde no se cumplen 1-4 y aplicar la regla apropiada

Terminacin:
Limitar cambios de valor de false a true, pero no a la inversa (un cambio) Al finalizar, es inmediato eliminar el cdigo muerto

87

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo
X := 3

L(X) = false L(X) = false true L(X) = false true L(X) = false true Y := 0 L(X) = false true

L(X) = false true


Y := Z + W

B>0

L(X) = false true


A := 2 * X X := X * X

L(X) = false true L(X) = false L(X) = false true L(X) = false true
88

Sentencia muerta

X := 4 A<B

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizacin Dependiente de Mquina


Pretende aprovechar las caractersticas especficas de la mquina para acelerar la ejecucin del programa
Considerar los ciclos de reloj que gasta cada instruccin de cdigo mquina
Utilizar desplazamientos de bits para multiplicar y dividir Utilizar la instruccin XOR reg,reg que accede menos a memoria, para poner un registro a cero Para acceder menos a memoria, utilizar saltos relativos de 8 o 16 bits

Alinear instrucciones/datos para que se acceda en un nico ciclo de memoria Combinar operaciones en una misma instruccin
Utilizar el direccionamiento con pre- y post-incremento

89

Optimizacin de Cdigo. Procesadores de Lenguaje II

Optimizaciones Dependientes de Mquina


Sacar provecho de todas las formas de direccionamiento del procesador Seleccin de instrucciones:
Mov Add Mov R2, (R3) R2, #1, R2 (R3), R2

Utilizar acceso indexado para los arrays

Usar una instruccin ms eficiente que reemplace una secuencia de instrucciones. Ejemplo:
Add (R3), 1, (R3)

Reordenar las instrucciones para paralelizar su ejecucin

Un Pentium es capaz de ejecutar en paralelo un clculo con enteros con otro de flotantes Evitar que la siguiente instruccin dependa del resultado de la anterior para que no se produzca un fallo en el pipe-line Incluso puede ser interesante aadir NOPs para evitar los fallos de

Optimizar el uso de los registros del procesador

pipe-line

Es especialmente importante en los procesadores RISC


90

Optimizacin de Cdigo. Procesadores de Lenguaje II

Seleccin de instrucciones
Seleccin de instrucciones:
Usar una instruccin ms eficiente que reemplace una secuencia de instrucciones Ejemplo:
Mov Add Mov R2, (R3) R2, #1, R2 (R3), R2

Add (R3), 1, (R3)

Reordenar las instrucciones para maximizar la ejecucin paralela de instrucciones Alinear los datos
91

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplos Alineacin
Alinear datos
Align 8-bit data on any boundary. Align 16-bit data to be contained within an aligned 4-byte word. Align 32-bit data on any boundary which is a multiple of four. Align 64-bit data on any boundary which is a multiple of eight. Align 80-bit data on a 128-bit boundary (that is, any boundary which is a multiple of 16 bytes).

Alinear cdigo
Loop entry labels should be 16-byte aligned when less than eight bytes away from a 16-byte boundary. Labels that follow a conditional branch should not be aligned. Labels that follow an unconditional branch or function call should be 16-byte aligned when less than eight bytes away from a 16byte boundary.

92

Optimizacin de Cdigo. Procesadores de Lenguaje II

Asignacin de Registros
Mquinas con un solo registro (acumulador)
Cdigo mquina tpico
Todas las operaciones trabajan sobre el acumulador Cargar X Guardar X Operar X Ejemplo: T=X+Y Cargar X Sumar Y Guardar T

La optimizacin ser reducir el nmero de operaciones del carga y descarga del acumulador
93

Optimizacin de Cdigo. Procesadores de Lenguaje II

Asignacin de Registro en Mquinas Multi-Registro


La asignacin de registros tiene dos pasos
Register Allocation
Cuando se decide que una variable se ha de guardar en un registro

Register Assignment
Cuando se selecciona el registro para guardar una variable

Como optimizar la asignacin de registros


Minimizar el nmero de variables temporales necesarias para evaluar una expresin Asignar las variables temporales a registros
Si hay suficientes registros ya se ha acabado Si no hay que decidir que variables se han de transferir a memoria (spillover) y como minimizar el nmero de transferencias

94

Optimizacin de Cdigo. Procesadores de Lenguaje II

Carga/Descarga de Registros
Minimizar el nmero de operaciones de carga y descarga
Que registro se ha de descargar a memoria?
No guardar en memoria los operandos izquierdos de operaciones no conmutativas (ej. / -) siempre que haya otra posibilidad Guardar en memoria el valor que ms se tardar en utilizar en el programa

Seleccionar el registro para una variable V


Si hay algn registro libre asignarlo a V sino seleccionar el registro que ms tardar en utilizarse guardar el valor del registro si ha sido modificado asignarlo a V
95

Optimizacin de Cdigo. Procesadores de Lenguaje II

Asignacin local de registros


Se efecta asignacin local de registros
Considera el uso posterior de cada variable slo en el bloque Al final del bloque se almacenan todas las variables en memoria

Se usan descriptores
Descriptores de registros: qu variables almacenan Descriptores de variables: en qu sitios se encuentran

Para cada sentencia x:= y op z 1. 2. 3. 4. 5.


Determinar L, y, z Generar MOV y,L (si necesario) Generar OP z,L (si necesario) Indicar que x est en L Si los valores de y o z no tienen uso posterior, liberar sus registros

L: Localizacin para guardar

resultado: obtenreg(x,y,z)

y: una de las posiciones de y z: una de las posiciones de z Ideal: y, z en registros


96

Almacenar las variables vivas en memoria (segn descriptores)

Optimizacin de Cdigo. Procesadores de Lenguaje II

Estrategia de asignacin de registro


Debera L ser un registro o una posicin de memoria? Estrategia simple: Mantener resultados calculados en registros lo mximo posible
El nmero de registros puede agotarse

Al final del bloque bsico salvar todos los registros en memoria


Es el algoritmo ms simple Las tcnicas globales gestionan el uso inter-bloque de los registros mediante anlisis de flujo de datos

97

Optimizacin de Cdigo. Procesadores de Lenguaje II

Obtencin de registros
obtenreg(x:=y op z):
1. usar el registro de y si est en un registro que no tiene otra variable, y adems y no est viva ni tiene uso posterior. Si no: 2. usar un registro vaco si hay. Si no: 3. usar un registro ocupado (spill) si op requiere que x est en un registro o si x tiene uso posterior. Actualizar el descriptor de registro. Si no: 4. usar la posicin de memoria de x

98

Optimizacin de Cdigo. Procesadores de Lenguaje II

Ejemplo Asignacin Local Registros


f=(a-b)*(c+d)+e
Distinguiendo variables temporales en bloque bsico Instrucciones

t1=a-b

MOV a, R0 SUB b, R0 MOV c, R1 ADD d, R1

Cdigo

Descriptores Reg
R0 con t1 R1 con t2 R1 con t3 R1 con t4

t2=c+d t3=t1*t2 t4=t3+e f=t4


Instrucciones

MULT R0, R1 ADD e, R1 MOV R1, f

Cdigo
MOV a, R0 SUB b, R0 MOV c, R1 ADD d, R1 MOV R1, R2 MULT R0, R2 MOV R2, R3 ADD e, R3 MOV R3, f //SALVAR R1-R4

Descriptores Reg
R0 con t1 R1 con t2 R2 con t3 R3 con t4
99

t1=a-b
Las variables temporales no se distinguen

t2=c+d t3=t1*t2 t4=t3+e f=t4

Optimizacin de Cdigo. Procesadores de Lenguaje II

Asignacin global de registros


La informacin del grafo de flujo de datos evita tener que almacenar todas las variables tras cada bloque bsico: slo variables vivas Estrategia global: reservar registros para variables ms activas
Contar usos de variables Ubicacin en bucles internos (heurstica: factor 10A) Estimar el ahorro de diferentes variables en bucles
Uso de x en un registro: ahorro de una direccin: coste 1 Mantener variable viva en bucle: ahorro de una instruccin: coste 2

cos te =

bloques B en L
100

(uso(x, B) + 2 * viva(x, B))

También podría gustarte