You are on page 1of 55

Tema 3.

Optimizacin de Cdigo

Lecciones 5,6,7,8 y 9

Compiladores II (28/04/2014 10:36)

- 3.1 -

Generacin de Cdigo y Optimizacin Generacin de cdigo


Se realiza mientras se analiza el programa Libre del contexto

Optimizacin
Se realiza despus de la generacin de cdigo de todo el programa o de un elemento ejecutable del programa (funcin, procedimiento, etc). Dependiente del contexto
Programa fuente

Se ejecuta todo junto. Mientras se analiza se genera cdigo

Analizador lexicogrfico, sintctico y semntico


Generador de Cdigo

Optimizador Programa objeto


Compiladores II (28/04/2014 10:36) - 3.2 -

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

Funcionamiento
Revisa el cdigo generado a varios niveles de abstraccin y realiza las optimizaciones aplicables al nivel de abstraccin
Representaciones de cdigo intermedio de ms a menos abstractas
rbol sintctico abstracto
Optimizar subexpresiones redundantes, reduccin de frecuencia, etc.

Tuplas o cuadruplas
Optimizar en uso de los registros o de las variables temporales

Ensamblador/Cdigo mquina
Convertir saltos a saltos cortos Reordenar instrucciones
Compiladores II (28/04/2014 10:36) - 3.3 -

Optimizacin Funcionamiento (continuacin)


Representaciones de cdigo para extraer informacin
Grafos.

Condiciones que se han de cumplir


El cdigo optimizado se ha de comportar igual que el cdigo de partida excepto por ser ms rpido o ocupar menos espacio. Hay que buscar transformaciones que no modifiquen el comportamiento del cdigo segn el comportamiento definido para el lenguaje de programacin. Ejemplo
Si no se ha definido el orden de evaluacin de los operandos la siguiente optimizacin es vlida
B=2*A+(A=c*d);

Pasar a
A=c*d; B=A*3;

Compiladores II (28/04/2014 10:36)

- 3.4 -

Tipos de Optimizacin Optimizacin independiente de mquina


Reduccin de frecuencia

Optimizacin dependiente de mquina


Asignacin de registros Reordenacin de las instrucciones

Optimizacin local
Reduccin de potencia Folding Propagacin de constantes

Optimizacin global
anlisis del grafo del flujo de ejecucin

Optimizacin de bucles
Loop unrolling Reduccin de frecuencia Reduccin de potencia

Compiladores II (28/04/2014 10:36)

- 3.5 -

Optimizacin Local Las optimizaciones locales se realizan sobre el bloque bsico Optimizaciones locales
Folding Propagacin de constantes Reduccin de potencia Reduccin de subexpresiones comunes

Bloque Bsico
Un bloque bsico es un fragmento de cdigo que tiene una nica entrada y salida, y cuyas instrucciones se ejecutan secuencialmente. Implicaciones:
Si se ejecuta una instruccin del bloque se ejecutan todas en un orden conocido en tiempo de compilacin.

La idea del bloque bsico es encontrar partes del programa cuyo anlisis necesario para la optimizacin sea lo ms simple posible.

Compiladores II (28/04/2014 10:36)

- 3.6 -

Bloque Bsico (ejemplos) Ejemplos (separacin errnea):


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;

BB1: i=1; BB2: i<10; BB3: b=b+a[i]; c=b*i; ++i BB4: a=3; b=4; goto l1; BB5: c=10; BB6: l1: d=3; e=4;
- 3.7 -

Separacin correcta
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;
Compiladores II (28/04/2014 10:36)

Ensamblamiento (Folding) El ensamblamiento es 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

Propagacin de constantes
Desde que se asigna a una variable un valor constante hasta la siguiente asignacin, se considera a la variable equivalente a la constante. Ejemplo: Propagacin Ensamblamiento
PI=3.14 -> PI=3.14 -> PI=3.14 G2R=PI/180 -> G2R=3.14/180 -> G2R=0.017

PI y G2R se consideran constantes hasta la prxima asignacin.

Estas optimizaciones permiten que el programador utilice nombres para las constantes sin introducir ineficiencias.

Compiladores II (28/04/2014 10:36)

- 3.8 -

Extensiones 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.

Usar las propiedades conmutativa y asociativa.


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

Compiladores II (28/04/2014 10:36)

- 3.9 -

Extensiones Extender la aplicacin fuera del bloques bsicos


Hay que realizar un anlisis del flujo de ejecucin y es complejo. Ejemplo:
i=0; loop: i=i+1 if (i<10) goto loop; Se transforma errneamente en i=0; loop: i=1 if (1<10) goto loop;

Compiladores II (28/04/2014 10:36)

- 3.10 -

Implementacin del Folding Implementacin durante el anlisis sintctico/semntico o creacin del rbol sintctico.
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
Buscar partes del rbol donde se puede aplicar la propiedad conmutativa Buscar las constantes y operarlas Reconstruir el rbol

Compiladores II (28/04/2014 10:36)

- 3.11 -

Ejemplo de Folding Expresin: rbol:


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

+- 3 +- + +- 5 +- 6 4 A 10

Trminos:
3 -5 -6 4 -(A*10)

Resultado: -4-(A*10)
Compiladores II (28/04/2014 10:36) - 3.12 -

Implementacin de la Propagacin de Constantes


Implementacin posterior
Separar el rbol en bloques bsicos
Cada bloque bsico ser una lista de expresiones y asignaciones

Para cada bloque bsico


Inicializar el conjunto de definiciones a conjunto vaco.
Definicin: (variable,constante)

Procesar secuencialmente la lista de expresiones y asignaciones Para expresin y asignacin


Sustituir las apariciones de las variables que se encuentran en el conjunto de definiciones por sus constantes asociadas.

Para asignaciones
Eliminar del conjunto de definiciones la definicin de la variable asignada Aadir la definicin de la variable asignada si se le asigna una constante

Compiladores II (28/04/2014 10:36)

- 3.13 -

Ejemplo de Separacin en Bloques Bsicos


Fun +- [] +- => +| | +-

f +- x +- y InstrComp +- ; +- = | +- i | +- 0 +- ; +- = | +| ++- ; +| | | | | | | | | | | | | | +-

Fun f(x,y)=> { i=0; b=5; while (i<x) { print(i*b); i=0; i=i+1; b=5; } x*b }
b 5 while +- < | +- i | +- x +- InstrComp +- ; +- Print | +- * | +| ++- = +- i +- + ++* +- x +- b

i<x

i b

print(i*b); i=i+1;

i 1

Compiladores II (28/04/2014 10:36)

- 3.14 -

Eliminacin de subexpresiones redundantes.


Las subexpresiones que aparecen ms de una vez se calculan una sola vez y se reutiliza el resultado. Idea: Detectar las subexpresiones iguales y que las compartan diversas ramas del rbol. Problema: Hay que trabajar con un grafo acclico. Dos expresiones pueden ser equivalentes y no escribirse de la misma forma A+B es equivalente a B+A. Para comparar dos expresiones se utiliza la forma normal
Se ordenan los operandos: Primero las constantes, despus variables ordenadas alfabticamente, las variables indexadas y las subexpresiones. Ejemplo
X=C+3+A+5 -> X= 3+5+A+C Y=2+A+4+C -> Y=2+4+A+C

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


A-B -> A+ (-B) A/B -> A * (1/B)
Compiladores II (28/04/2014 10:36) - 3.15 -

Implementacin Primero se aplica el ensamblamiento y la propagacin de constantes. Despus se reordena el rbol sintctico hasta obtener la forma normal. Se inicia la eliminacin de las subexpresiones redundantes. Hay que considerar las asignaciones que pueden convertir una subexpresion redundante en no redundante. Ejemplo:
Q=A+B A=Q^2+2 C[1]=A+B+P
J=2*D+3 D=D*2 J=J+D

A+B no es redundante por la asignacin

Ejemplo de eliminacin de subexpresiones

Compiladores II (28/04/2014 10:36)

- 3.16 -

Optimizaciones Dentro de Bucles La optimizacin de bucles es muy importante por las mejoras en tiempo de ejecucin que se obtienen Estrategias de optimizacin dentro de bucles
Expansin de bucles (loop unrolling) Reduccin de frecuencia (frequency reduction) Reduccin de potencia (strength reduction)

Compiladores II (28/04/2014 10:36)

- 3.17 -

Expansin de bucles(loop unrolling) La expansin de bucles 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

La expansin de un bucle puede ser muy costosa en espacio. Hay que poner un criterio heurstico para decidir si se aplica la expansin.
Se puede aplicar una expansin parcial en la que sigue existiendo el bucle, pero cada iteracin del nuevo bucle corresponde a varias iteraciones del bucle original.

En un bucle expandido se ha de sustituir el ndice del bucle por el valor constante correspondiente
Compiladores II (28/04/2014 10:36) - 3.18 -

Reduccin de frecuencia. (frequency reduction)


La reduccin de frecuencia detecta las operaciones invariantes de bucle y las calcula una nica vez delante del bucle. Ejemplo:
for i=1 to n do c=i*sin(a); sin(a) es una operacin invariante del bucle que puede pasar de calcularse n veces a una con la siguiente transformacin tmp=sin(a); for i=1 to n do c=i*tmp;

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
Compiladores II (28/04/2014 10:36) - 3.19 -

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.

Problema del mtodo anterior


Cuando no se entra en el bucle se calculan sus operaciones invariantes. La solucin es evaluar antes la condicin de salida del bucle.
Compiladores II (28/04/2014 10:36) - 3.20 -

Reduccin de potencia(strength reduction) Se busca sustituir operaciones costosas por otras mas simples. Ejemplo:
sustituir productos por sumas.
a=2*a a=a+a

Evitar la operacin append (++)


A=length(s1 ++ s2) convertirlo en A=length(s1)+length(s2)

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 ha resolver
Detectar las invariantes de bucle
Ya esta solucionado

Detectar las variables inductivas

Compiladores II (28/04/2014 10:36)

- 3.21 -

Variables Inductivas Una variable V es inductiva cuando la nica forma en que se modifica su cdigo es V=V+K, donde K es una invariante de bucle. Se considerar la necesidad de generar una variable inductiva temporal T a partir de encontrar expresiones de la forma V*C, donde C es una invariante de bucle.
Se sustituir V*C por T Se inicializa T despus de la inicializacin de V como T=V*C (solo se ejecuta al entrar en el bucle) Al final de cada iteracin se aade T=T+C*K

Compiladores II (28/04/2014 10:36)

- 3.22 -

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 y el optimizador

La optimizacin global a partir del anlisis del grafo del flujo de ejecucin 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


Compiladores II (28/04/2014 10:36) - 3.23 -

Construccin del Grafo del Flujo de Ejecucin


Tipos de grafo
Orientado a procedimiento/funcin Grafo de llamadas

Ejemplo
int fact(int n) { int r; r=1; i=1; while (i<=n) { r=r*i; ++i; } return r; }

r=1 i=1

bloque bsico

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

while (i<=n)

bloque bsico

bloque bsico

return r;

Compiladores II (28/04/2014 10:36)

- 3.24 -

Construccin del Grafo del Flujo de Ejecucin


Pasos
Dividir el programa en bloques bsicos
Se representa el programa en un cdigo intermedio donde queden explcitamente representados los saltos condicionales e incondicionales. Un bloque bsico ser cualquier trozo de cdigo que no contenga saltos ni etiquetas en su interior (es posible tener etiquetas al inicio del bloque y saltos al final).

En el grafo, los vrtices representan los bloques bsicos y las aristas representan los saltos de un bloque bsico a otro.

Deteccin de cdigo no utilizado


El cdigo no utilizado son los bloques bsicos donde no llega ninguna arista.

Compiladores II (28/04/2014 10:36)

- 3.25 -

Anlisis del Grafo del Flujo de Ejecucin Hay que considerar como la informacin sobre las variables y expresiones se propaga a travs del grafo. Problemas resueltos durante el anlisis del grafo
expresiones disponibles (al seguir la ejecucin sigue siendo vlido el resultado obtenido) Alcance de las definiciones variables vivas expresiones muy utilizadas

Para la resolucin de los problemas anteriores se utiliza la idea de punto entre instrucciones o bloques bsicos.
r=1 i=1

Puntos
while (i<=n)

Compiladores II (28/04/2014 10:36)

- 3.26 -

Expresiones Disponibles (Available expresions)


El problema de las expresiones disponibles consiste en determinar que expresiones estn disponibles al inicio de cada bloque Algoritmo
Para cada bloque bsico se definen 4 conjuntos
AE_TOP(BB): la expresin est disponible en el punto que precede a BB AE_KILL(BB): la expresin ya no ser vlida despus de la ejecucin de BB por que se ha modificado algn operando. AE_GEN(BB): Se ha evaluado la expresin en BB sin que se modifiquen sus operndos. AE_BOT(BB): La expresin est disponible justo despus de la ejecucin de BB

Ecuacin para las expresiones disponibles


AE_BOT(BB)=(AE_TOP(BB)AE_KILL(BB)) AE_GEN(BB) AE_TOP(BB)= p precedente de BB AE_BOT(P)

Compiladores II (28/04/2014 10:36)

- 3.27 -

Alcance de las Definiciones (reaching definitions)


El valor de una variable se define cuando se le asigna un valor. Este valor definido se pierde cuando se realiza una nueva asignacin. El problema del alcance de las definiciones es el mismo que el problema de las expresiones disponibles, pero en el caso de las variables. Ecuaciones:
RD_BOT(BB)=(RD_TOP(BB)-RD_KILL(BB)) RD_GEN(BB)
RD_TOP(BB)= p precedente de BB RD_BOT(P)

Compiladores II (28/04/2014 10:36)

- 3.28 -

Variables Vivas (live variables)


Una variable esta viva en un punto p cuando su valor es requerido para un camino de ejecucin que pasa por p. Un camino requiere el valor de una variable cuando hay una asignacin de la variable al principio y una lectura al final. Uso delimitar exactamente en que partes del cdigo es necesaria una variable. Ecuaciones
LV_TOP(BB)=(LV_BOT(BB)-LV_DEF(BB)) LV_USE(BB) LV_BOT(BB)= s sucesor de BB LV_TOP(S)

Compiladores II (28/04/2014 10:36)

- 3.29 -

Expresiones muy Utilizadas (Very Busy Expression)


Una expresin es muy utiliza en un punto p cuando el valor de la expresin se requiere antes que el valor de cualquiera de sus trminos a lo largo de cualquier camino que empieza en p. Ecuaciones
VBE_TOP(BB)=(VBE_BOT(BB)BVE_DEF(BB)) BVE_USE(BB) VBE_BOT(BB)= s sucesor de BB VBE_TOP(S)

Compiladores II (28/04/2014 10:36)

- 3.30 -

Algoritmos de Anlisis del Flujo de Ejecucin


Tipos
Algoritmos basados en la estructura de los bucles
Son rpidos Hay que reducir el grafo a bucles sin saltos que entren en medio del bucle. Los programas estructurados son reducibles.

Algoritmos iterativos
Son lentos pero genricos Tipos:
lista de trabajos round robin

Compiladores II (28/04/2014 10:36)

- 3.31 -

Aplicaciones a la Optimizacin de Programas


expresiones disponibles (al seguir la ejecucin sigue siendo vlido el resultado obtenido)
Eliminar expresiones redundantes

Alcance de las definiciones


Reutilizar las copias en registro de los valores de las variables. Propagacin de constantes Reduccin de frecuencia

variables vivas
Reutilizar el espacio de variables. Eliminar variables innecesarias

expresiones muy utilizadas


optimizar la asignacin de registros

Compiladores II (28/04/2014 10:36)

- 3.32 -

Ejemplo: Optimizacin Global


IF A(1)<0 & J>0 THEN L:=1 ELSE L:=2; J:=2; FOR K:=1 STEP 2 UNTIL J DO BEGIN

A(K+1):=A(K)+A(K+1); I:=J; L:=K*I; END A(1)<0

J>0

L:=2 J:=2 K:=1 K<J

L:=1

A(K+1):=A(K)+A(K+1); I:=J; L:=K*I K:=K+2

Compiladores II (28/04/2014 10:36)

- 3.33 -

Ejemplo de Optimizacin Global Variables Vivas


{A(1),J}
A(1)<0 {J}

J>0

L:=2 L:=1

J:=2 K:=1

{J,K} K<J {J,K} A(K+1):=A(K)+A(K+1); I:=J; L:=K*I K:=K+2 {J,K}

Compiladores II (28/04/2014 10:36)

- 3.34 -

Ejemplo de Optimizacin Global Eliminacin de Variables Innecesarias


{A(1),J}
A(1)<0 {J}

J>0

L:=2 L:=1

J:=2 K:=1 {J,K} K<J {J,K} A(K+1):=A(K)+A(K+1); I:=J; L:=K*I K:=K+2 {J,K}

Se puede eliminar L e I Las A(K),A(K+1) no se eliminan pues no se han podido considerar en el clculo de variables vivas
Compiladores II (28/04/2014 10:36) - 3.35 -

Ejemplo de Optimizacin Global Propagacin de Constantes


{A(1),J}
A(1)<0

Eliminar J>0 por no utilizarse y saltar al mismo bloque bsico Eliminar A(1)<0 despus de eliminar J>0

J>0

J:=2 K:=1

{J:=2}
K<2

A(K+1):=A(K)+A(K+1); K:=K+2

Se puede expandir el bucle

Compiladores II (28/04/2014 10:36)

- 3.36 -

Ejemplo de Optimizacin Global Expandir el Bucle


J:=2 K:=1

A(1+1):=A(1)+A(1+1); A(2+1):=A(2)+A(2+1);

Eliminar J y k por que no se utilizan y realizar los clculos entre constantes

A(2):=A(1)+A(2); A(3):=A(2)+A(3);

Compiladores II (28/04/2014 10:36)

- 3.37 -

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

de las la del

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.

Compiladores II (28/04/2014 10:36)

- 3.38 -

Optimizaciones Dependientes de Mquina


Sacar provecho de todas las formas de direccionamiento del procesador.
Utilizar acceso indexado para los arrays.

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 la pipe-line. Incluso puede ser interesante aadir NOPs para evitar los fallos de pipe-line.

Optimizar el uso de los registros del procesador.


Es especialmente importante en los procesadores RISC.

Considerar el tamao de la cache del procesador.

Compiladores II (28/04/2014 10:36)

- 3.39 -

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.

Compiladores II (28/04/2014 10:36)

- 3.40 -

Generar Cdigo para Maquina con un Acumulador a partir de Notacin Polaca


Ideas:
Utilizar una pila de variables temporales donde se guardan los operandos. Mirar de eliminar las operaciones de carga/descarga innecesarias.

Ejemplo: X=A+(B*C+D)
Notacin polaca inversa:
XABC*D++=

Cdigo generado sin optimizar


Cargar B Mult C Guardar T1 ; B*C Cargar T1 Sumar D Guardar T2 ; B*C+D Cargar A Sumar T2 Guardar T3 ; A+(B*C+D) Cargar T3 Guardar X

Compiladores II (28/04/2014 10:36)

- 3.41 -

Optimizacin Ideas
Retrasar en todo lo posible las instruccin Guardar Reutilizar el contenido del acumulador Sacar provecho de la conmutatividad de las operaciones

Ejemplo:
Cargar B Mult C Guardar T1 ; B*C Cargar T1 Sumar D Guardar T2 ; B*C+D Cargar A Sumar T2 Guardar T3 ; A+(B*C+D) Cargar T3 Guardar X Eliminar
por reutilizacin del acumulador Eliminar por reutilizacin del acumulador

Cargar B Mult C ; B*C Sumar D ; B*C+D Guardar T2 ; B*C+D Cargar A Sumar T2 ; A+(B*C+D) Guardar X Aplicar la
propiedad conmutativa de la suma

Cargar B Mult C ; B*C Sumar D ; B*C+D Sumar A ; B*C+D+A Guardar X


- 3.42 -

Compiladores II (28/04/2014 10:36)

Asignacin de Registro en Mquinas Multi Registro


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

Register Assignment
Es 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 y como minimizar el nmero de transferencias

Compiladores II (28/04/2014 10:36)

- 3.43 -

Minimizar el Nmero de Variables Temporales


Idea:
Minimizar el nmero de registros necesarios para los operandos de una operacin y luego considerar en que orden se han de calcular los operandos para minimizar el nmero de registros del clculo completo
Operacin binaria

Operando 1 n registros

Operando 2 m registros

Max{n,m+1} registros R=Calcular Op1 Calcular Op2 Operacin R,Op2


Compiladores II (28/04/2014 10:36)

Max{n+1,m} registros R=Calcular Op2 Calcular Op1 Operacin Op1,R


- 3.44 -

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. Slo tiene sentido si el procesador no permite divisiones o restas con los operandos invertidos ( -A+B, A\B). 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 si hay un registro cuyo valor no se necesitara asignarlo a V sino seleccionar el registro que ms tardar en utilizarse guardar el valor del registro si ha sido modificado asignarlo a V

Compiladores II (28/04/2014 10:36)

- 3.45 -

Cuando se utilizar una Variable Para saber cuando se utilizar una variable se ha de aplicar el clculo de las variables vivas. Uso de los registros Ejemplo: a b c d e R0 R1 R2
c=c*b a=a+b d=d*c b=d e=c b b d d e c c c c c a a b b

Compiladores II (28/04/2014 10:36)

- 3.46 -

Optimizar Cargas y Descargas Descargar una variable modificada es ms costoso que una no modificada. Para considerar esta diferencia de coste se utiliza el siguiente grafo
Los vrtices representan los estados de utilizacin de los registros y Las aristas representan las cargas y descargar necesarias para pasar de un estado a otro.

Se busca el camino de menor coste que vaya del estado de los registros al inicio del bloque bsico hasta el estado de estos al final del bloque bsico

Compiladores II (28/04/2014 10:36)

- 3.47 -

Arquitectura Mquina y Generacin de Cdigo Real.


Generar cdigo por tabla
A cada instruccin de cdigo intermedio le corresponde una o ms instrucciones de cdigo mquina que se han guardado en una tabla.
push pop
MOV (SP)+,R1 MOV R1,-(SP)

Los registros no siempre son genricos


68K registros de datos y direcciones separados Pentium registros separados para enteros y flotantes

Una instruccin de cdigo mquina puede ser varias instrucciones de cdigo intermedio
En la misma instruccin se realiza el clculo de la direccin de memoria del elemento de un array
Compiladores II (28/04/2014 10:36) - 3.48 -

Ejemplo de Optimizacin dependiente de Mquina: Pentium y Pentium II (I)


Ayudar al compilador para que pueda optimizar el cdigo Tener en cuenta los algoritmos de prediccin de saltos Evitar paradas por uso parcial de registros (Avoid partial register stalls). Alinear los datos Ordenar el cdigo para evitar fallos de la cache de prelectura de instrucciones Reordenar las instrucciones para maximizar la ejecucin paralela de instrucciones.

Compiladores II (28/04/2014 10:36)

- 3.49 -

Ejemplo de Optimizacin dependiente de Mquina: Pentium y Pentium II (II)


Evitar los prefijos de instruccin Evitar leer y escribir sobre la misma memoria con diferentes tipos de datos. Emparejar CALL y RET Evitar cdigo automodificable No poner datos en el segmento de cdigo Calcular las direcciones de destino cuanto antes

Compiladores II (28/04/2014 10:36)

- 3.50 -

Como Escribir los Programas C Ayudar al compilador para que pueda optimizar el cdigo
Minimizar el uso de variables globales Minimizar el uso de punteros Minimizar el uso de estructuras de control complejas No usar register Usar const No contradecir al sistema de tipos

Tener en cuenta los algoritmos de prediccin de saltos. Suposiciones del predictor


No saltar en caso de un salto condicional hacia delante Saltar en caso de salto condicional hacia atrs

Compiladores II (28/04/2014 10:36)

- 3.51 -

Reducir el Nmero de Saltos Reduce la posibilidad de predicciones errneas Reduce el nmero de entradas en la BTB (Branch Target Buffer) Ejemplo: ebx = (A<B) ? C1 : C2;
cmp A, B ; condition jge L30 ; conditional branch mov ebx, CONST1 jmp L31 ; unconditional branch L30: mov ebx, CONST2 L31:

Pentium
xor ebx, ebx cmp A, B setge bl ;clear ebx ;When ebx = 0 or 1 ;OR the complement condition dec ebx ;ebx=00...00 or 11...11 and ebx, (CONST2-CONST1) ;ebx=0 or (CONST2-CONST1) add ebx, min(CONST1,CONST2)

Pentium II
move ebx,CONST1 cmp A, B cmovege ebx, CONST2
Compiladores II (28/04/2014 10:36) - 3.52 -

Evitar paradas por uso parcial de registros (Avoid partial register stalls).
Register Stall al acceder a EAX
MOV AX, 8 ADD ECX, EAX

En el caso de Pentium II se puede producir para instrucciones no contiguas


MOV AL, 8 MOV EDX, 0x40 MOV EDI, new_value ADD EDX, EAX ;Partial stall

Compiladores II (28/04/2014 10:36)

- 3.53 -

Alinear 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.

Compiladores II (28/04/2014 10:36)

- 3.54 -

Reordenar las instrucciones para maximizar la ejecucin paralela


Pairing cannot be performed when the following conditions occur:
The next two instructions are not pairable instructions (see Appendix A for pairing characteristics of individual instructions). In general, most simple ALU instructions are pairable. The next two instructions have some type of register contention (implicit or explicit). There are some special exceptions to this rule where register contention can occur with pairing. These are described later. The instructions are not both in the instruction cache. An exception to this which permits pairing is if the first instruction is a one-byte instruction.

Compiladores II (28/04/2014 10:36)

- 3.55 -

You might also like