Você está na página 1de 11

30/04/2012

Linguagens e Programao

9 Optimizao de Cdigo
Fontes: 1. Processadores de Linguagens da concepo implementao, Rui Gustavo Crespo. IST Press.1998. Cap. 9 Optimizao de Cdigo 2. Compiladores Princpios,Tcnicas e Ferramentas AlfredV.Aho,R.Sethi e Jeffrey D.Ullman, 2007. Cap. 10 Optimizao de cdigo

Ana Madureira
Engenharia Informtica Ano Lectivo: 2011/2012

Optimizao de Cdigo
Um optimizador de cdigo pode, opcionalmente, estar presente para melhorar o cdigo (intermdio ou objecto) tanto em termos de velocidade, de espao, ou ambos A optimizao automtica pode ser feita tipicamente em trs ocasies: 1. na representao intermediria, antes da gerao de cdigo 2. durante o processo de gerao de cdigo, que j gerado de forma optimizada 3. aps a gerao de cdigo directamente no cdigo objecto

30/04/2012

Entidade responsvel pela optimizao

Cdigo fonte

Front end

Cdigo intermdio

Gerador de cdigo

Cdigo objecto

Utilizador alterao do algoritmo transformao de ciclos

Compilador melhorar ciclos, chamadas a procedimentos, clculo de endereos

Compilador atribuio de registos escolha de instrues transformaes peephole

Propriedades do processo de optimizao


O melhor conjunto de transformaes de optimizao aquele que permite alcanar o melhor benefcio atravs do menor esforo Propriedades presentes:
A optimizao tem por objectivo melhorar algum aspecto do cdigo gerado (no encontrar o ptimo) Os aspectos geralmente considerados so o espao ocupado, o tempo de execuo, etc A transformao deve preservar o significado do programa a optimizao no deve alterar a sada do programa A transformao deve valer a pena Optimizao local - aplica-se apenas a um bloco bsico Optimizao global - aplica-se a todos os blocos bsicos de um procedimento ou funo Optimizao inter-procedimental - aplica-se a todos os procedimentos de uma unidade de compilao

Geralmente consideram-se trs nveis de optimizao:


A maior parte dos compiladores efectua a 1 optimizao; os compiladores comerciais efectuam tambm a 2; e apenas alguns fazem algum trabalho quanto 3

30/04/2012

Optimizao durante a gerao de cdigo objecto


Dependente da mquina alvo Requer uma anlise do fluxo de dados (como por exemplo a anlise do tempo de vida das variveis) Um dos problemas a ser resolvido na gerao de cdigo o da seleco da instruo: escolher uma instruo adequada entre as diversas instrues possveis (por exemplo, com diversos modos de endereamento) Outro problema o da alocao dos registos, que consiste na determinao das posies onde sero armazenados os dados durante a execuo das instrues (os registos). Normalmente considera-se uma hierarquia de posies possveis: os registos propriamente ditos (na CPU) o topo da pilha a memria em geral.

Optimizao aplicada representao intermdia


Independente da mquina Oportunidades de optimizao (optimizaes locais): eliminao de sub-expresses comuns eliminao de cdigo morto optimizao de ciclos propagao de cpia transformaes algbricas reduo de fora

30/04/2012

Eliminao de sub-expresses comuns


Admitamos que a mesma expresso ocorre mais de uma vez num trecho de programa. Se as variveis que ocorrem na expresso no tm os seus valores alterados entre as duas ocorrncias, possvel calcular seu valor apenas uma vez. Exemplo: ... x=a+b; ... y=a+b; ... Se os valores de a e de b no so alterados, possvel guardar o valor da expresso a+b numa varivel temporria (t1) ... t1=a+b; x=t1; ... y=t1; ...

ou, se a varivel x ainda est disponvel com o mesmo valor da segunda vez que a expresso calculada, possvel dispensar o uso da varivel t1

... x=a+b; ... y=x;

...

Eliminao de sub-expresses comuns


Torna-se necessrio examinar todas as instrues que podem ocorrer entre as duas avaliaes da expresso. Se estas duas instrues no esto no mesmo bloco ser necessrio verificar quais outros blocos podem ser executados, para garantir que os valores que nos interessam no so alterados.

Mesmo no caso em que ambas as instrues esto no mesmo bloco necessrio considerar algumas situaes:

Se uma das variveis consideradas um elemento de um array, a[i], qualquer alterao de valor de um elemento a[j] do mesmo array entre as duas avaliaes da expresso faz com que no possamos garantir que o valor de a[i] no se alterou, porque difcil verificar se i j.

30/04/2012

Eliminao de sub-expresses comuns 2


No caso de variveis apontadas, devemos considerar, por segurana, que todas as variveis do tipo apontado foram alteradas. Exemplo: int *p, a, b; ... x=a+b; Neste caso, no sabemos ... para qual inteiro p aponta, e *p=...; portanto no podemos ... garantir que *p no uma y=a+b; referncia para a ou b. ...

No caso da chamada a uma funo, em princpio podemos fazer uma optimizao global, e examinar o cdigo da funo para determinar que efeitos colaterais ela pode ter. Isto possvel quando o trecho considerado para optimizao e a funo so compilados ao mesmo tempo.

Eliminao de cdigo morto


Cdigo morto (dead code) cdigo que no pode ser alcanado durante a execuo de um programa remoo do cdigo Algumas situaes: Cdigo aps uma instruo de encerramento de um programa ou de uma funo. Por exemplo aps uma instruo return; int f(int x) { return x++; /* o incremento no ser executado */ } Cdigo aps um teste com uma condio impossvel de ser satisfeita. Por exemplo: #define DEBUG 0 ... if(DEBUG) { ... /* este cdigo no ser executado */ }

30/04/2012

Eliminao de cdigo morto


Algumas situaes (cont.): Cdigo aps um comando de desvio, e no alvo de nenhum outro desvio. goto x; i=3; /* este cdigo no ser executado */ ... x: ...

Normalmente, no se espera que um programador escreva cdigo morto. No entanto pode acontecer, por exemplo, aps um estgio intermdio da optimizao de um programa, que sofreu algumas transformaes que causaram a existncia de cdigo morto. O exemplo de cdigo inserido para depurao que aparece acima, e que pode ser desligado ou activado dependendo do valor na macro #define no um bom exemplo, no caso de linguagens que oferecem uma opo de compilao condicional. Neste caso, a presena de cdigo morto seria identificada.

Optimizao de ciclos
H vrias optimizaes que se aplicam a ciclos, a mais comum das quais a transferncia de clculos invariantes do ciclo para fora dele (vamos supor que a instruo a ser movida para antes do ciclo x=e;). Para que isto possa ser feito, necessrio verificar: A expresso e composta apenas de constantes, ou de variveis cujos valores no so alterados dentro do ciclo Nenhum uso de x, dentro ou fora do ciclo deve ter acesso a um valor de x diferente do valor a que tinha acesso antes do original Em particular, o valor de x aps a sada do ciclo deve ser o mesmo do programa original. Mesmo assim, como vimos anteriormente, possvel piorar alguns programas, quando o ciclo executado zero vezes: a instruo dentro do ciclo no seria executada, mas fora do ciclo ser sempre executada uma vez.

30/04/2012

Optimizao de ciclos
Um exemplo de aplicao desta optimizao seria (vamos supor N>0, para simplificar): for (i=0, i<N, i++) { k=2*N; f(k*i); } que se transformaria em k=2*N; for (i=0, i<N, i++) f(k*i);

Propagao de cpia / Renomeao de variveis


Durante a gerao do cdigo intermdio podem ser introduzidas variveis temporrias que podem no ser estritamente necessrias. Normalmente esta eliminao feita dando outros nomes s variveis (temporrias ou no) que vo guardar os valores temporrios. Por exemplo, se tivermos no cdigo fonte x=a+b;, o cdigo intermdio ser t1=a+b; x=t1; e a varivel t1 pode ser eliminada.

30/04/2012

Propagao de cpia / Renomeao de variveis


Na avaliao de sub-expresses comuns, podemos ficar com vrias variveis desnecessrias, associadas s vrias cpias da sub-expresso. Por exemplo, se tivermos no cdigo fonte x=a+b; y=(a+b)*c; z=d+(a+b); teremos no cdigo intermdio t1=a+b; x=t1; t2=a+b; t3=t2*c; y=t3; t4=a+b; t5=d+t4; z=t5; e, eliminando as duas ltimas cpias de a+b, t1=a+b; x=t1; t2=t1; t3=t2*c; y=t3; t4=t1; t5=d+t4; z=t5; de maneira que (neste exemplo) todas as variveis temporrias podem ser eliminadas: x=a+b; y=x*c; z=d+x;

Propagao de cpia / Renomeao de variveis


Por vezes, a optimizao pode ser alcanada re-usando variveis temporrias. Isto feito mudando os nomes de algumas ocorrncias dessas variveis. Por exemplo, se tivermos x=(a+b)*(c+d); y=(e*f)+(g*h); o cdigo intermedirio seria t1=a+b; t2=c+d; t3=t1*t2; x=t3; t4=e*f; t5=g*h; t6=t4+t5; y=t6; e poderamos renomear t4 como t1, t5 como t2 e eliminar t3 e t6: t1=a+b; t2=c+d; x=t1*t2; t1=e*f; t2=g*h; y=t1+t2; Uma soluo menos bvia seria usar x e y como temporrias: x=a+b; t2=c+d; x=x*t2; y=e*f; t2=g*h; y=y+t2;

30/04/2012

Transformaes algbricas

Podemos aplicar algumas transformaes baseadas em propriedades algbricas, como comutatividade, associatividade, identidade, etc. Por exemplo, como a soma comutativa, podemos transformar x=a+b*c; em x=b*c+a; o que corresponde a trocar cdigo como Load b Mult c Store t1 Load a Add t1 Store x

por

Load b Mult c Add a Store x

que dispensa a varivel temporria t1, e as instrues que a manipulam.

Transformaes algbricas
Transformaes semelhantes podem ser baseadas na associatividade, permitindo trocar x=(a+b)+(c+d); por x=(((a+b)+c)+d); o que corresponde a trocar dispensando o uso das variveis temporrias t1 e t2.

Load a Add b Store t1 Load c Add d Store t2 Load t1 Add t2 Store x

por

Load a Add b Add c Add d Store x

Em aplicaes de clculo numrico podem surgir problemas de convergncia devido a erros de arredondamento quando se aplica este tipo de transformaes opes de compilao.

30/04/2012

Reduo de fora
H vrios exemplos em que operaes mais caras podem ser substitudas por operaes mais baratas. Por exemplo, para calcular o comprimento da concatenao de duas cadeias, podemos somar os comprimentos das duas. Em vez de strlen(strcat(s1, s2)) usamos strlen(s1) + strlen(s2) Outro caso em que a reduo de fora possvel no clculo do quadrado de um nmero. Se usarmos pow(x, 2), em C/C++, o cdigo gerado dever calcular e2.0 * ln x, utilizando sries para calcular (aproximadamente) o logaritmo natural e a exponencial. Em vez disso, podemos usar x*x, com apenas uma multiplicao.

Optimizao Peephole (ou de janela)


A gerao de cdigo objecto a partir de cada instruo individual do cdigo fonte pode originar programas que possuam redundncia e construes no optimizadas A tcnica de optimizao Peephole (buraco da agulha) um mtodo que consiste na anlise de uma pequena sequncia de instrues contguas do programa (chamada Peephole), incluindo cerca de 3 ou 4 instrues, e sua substituio por outra sequncia mais eficiente, sempre que possvel O Peephole uma pequena janela que vai sendo deslocada ao longo do cdigo Se esse conjunto de instrues coincide com sequncias pr-definidas para as quais haja um equivalente absoluto mais curto ou mais rpido faz-se a substituio Esta tcnica usada frequentemente sobre o cdigo objecto, podendo tambm ser aplicada sobre o cdigo intermdio Geralmente so requeridas vrias passagens o exame deve ser repetido at no haver mais substituies

10

30/04/2012

Optimizao Peephole
Algumas transformaes que so caractersticas deste mtodo: eliminao de instrues redundantes (eliminao de operaes redundantes de load e store, eliminao de cdigo morto, ...) optimizaes de fluxo de controlo (optimizao de ciclos, eliminao de saltos desnecessrios, ...) simplificaes algbricas utilizao de idiomas da mquina escolha de instrues entre vrias alternativas cuja execuo seja mais eficiente

Optimizao Peephole Exemplos


add #2, Rx add #3, Rx add #(2+3), Rx

mov Rx, a mov a, Rx

mov Rx, a

Esta sequncia surge frequentemente, por exemplo na gerao de cdigo para: a=b+c d=e+a

11