45
CODE OPTIMIZATION CODE OPTIMIZATION Presented By: Amita das Jayanti bhattacharya Jaistha Upadhyay

Compiladores - Otimização de código Intermediário

Embed Size (px)

DESCRIPTION

Seminário apresentado por alunos da Universidade de Pernambuco Caruaru sobre Otimizaçãod e Código Intermediário

Citation preview

Page 1: Compiladores - Otimização de código Intermediário

CODE OPTIMIZATIONCODE OPTIMIZATION

Presented By:

Amita das

Jayanti bhattacharya

Jaistha Upadhyay

Page 2: Compiladores - Otimização de código Intermediário

Designer da compilação

Analise Léxica

Analise Sintática

Analise Semântica

Geração do Código

Otimização de Código

Tabela de Símbolos

Exibição deErros

Código fonte

Código Objeto

Geração do Código Intermediário

Page 3: Compiladores - Otimização de código Intermediário

O que é otimização?O que é otimização?

Em computação, otimização é o processo de modificar Em computação, otimização é o processo de modificar fazer algum aspecto de um sistema para que trabalhe com fazer algum aspecto de um sistema para que trabalhe com mais eficiência ou utilize menos recursos. mais eficiência ou utilize menos recursos.

Por exemplo, um programa de computador pode ser Por exemplo, um programa de computador pode ser otimizada de modo que ele seja executado mais rápido, ou otimizada de modo que ele seja executado mais rápido, ou seja capaz de operar com o menos armazenamento de seja capaz de operar com o menos armazenamento de memória ou outros recursos, ou consomem menos memória ou outros recursos, ou consomem menos energia. O sistema pode ser um programa único de energia. O sistema pode ser um programa único de computador, um conjunto de computadores ou mesmo computador, um conjunto de computadores ou mesmo toda uma rede como a internet.toda uma rede como a internet.

Page 4: Compiladores - Otimização de código Intermediário

““Níveis” de otimizaçãoNíveis” de otimizaçãoOtimização pode ocorrer em um número de "níveis":Otimização pode ocorrer em um número de "níveis":

Nível de designNível de design

No nível mais alto, o projeto pode ser otimizado para fazer o No nível mais alto, o projeto pode ser otimizado para fazer o melhor uso dos recursos disponíveis. A implementação deste melhor uso dos recursos disponíveis. A implementação deste projeto irá se beneficiar do uso de algoritmos eficientes e projeto irá se beneficiar do uso de algoritmos eficientes e adequados a implementação destes algoritmos irão beneficiar de adequados a implementação destes algoritmos irão beneficiar de escrever código de boa qualidade. O projeto arquitetônico de escrever código de boa qualidade. O projeto arquitetônico de um sistema predominantemente afeta seu desempenho. A um sistema predominantemente afeta seu desempenho. A escolha do algoritmo afeta a eficiência mais do que qualquer escolha do algoritmo afeta a eficiência mais do que qualquer outro item do projeto.outro item do projeto.

Nível de compilaçãoNível de compilação

O uso de um compilador otimizado tende a assegurar que o O uso de um compilador otimizado tende a assegurar que o programa executável é optimizada, pelo menos tanto quanto o programa executável é optimizada, pelo menos tanto quanto o compilador pode prever.compilador pode prever.

Page 5: Compiladores - Otimização de código Intermediário

Nível AssemblyNível Assembly

No nível mais baixo, escrevendo código usando uma linguagem de No nível mais baixo, escrevendo código usando uma linguagem de montagem projetado para uma plataforma de hardware específico, montagem projetado para uma plataforma de hardware específico, normalmente, produzem o código mais eficiente, pois o programador normalmente, produzem o código mais eficiente, pois o programador pode aproveitar o repertório completo de instruções de máquina. Os pode aproveitar o repertório completo de instruções de máquina. Os sistemas de operação da maior parte das máquinas tem sido sistemas de operação da maior parte das máquinas tem sido tradicionalmente escrito em código Assembler por esta razão.tradicionalmente escrito em código Assembler por esta razão.

Runtime (tempo de execução)Runtime (tempo de execução)Apenas compiladores e programadores Apenas compiladores e programadores assemblerassembler são capazes de são capazes de realizar a otimização de tempo de execução.realizar a otimização de tempo de execução.

Page 6: Compiladores - Otimização de código Intermediário

Quando a otimizar?Quando a otimizar?

Optimização é muitas vezes realizada no final do estágio de Optimização é muitas vezes realizada no final do estágio de desenvolvimento, uma vez que:desenvolvimento, uma vez que:

• Reduz a legibilidadeReduz a legibilidade• Adiciona código que é utilizado para melhorar o Adiciona código que é utilizado para melhorar o

desempenhodesempenho

Page 7: Compiladores - Otimização de código Intermediário

Critérios para a otimização

Uma otimização deve preservar o significado de um programa:

- Não pode alterar a saída produzida para qualquer entrada.

- Não pode introduzir um erro

Deve, em média, acelerar os programas

Transformação deve valer a pena o esforço

Page 8: Compiladores - Otimização de código Intermediário

As melhorias podem ser feitas em várias fases:

Código Fonte:

- Alterações no algoritmo podem produzir melhorias espetaculares- Criação de perfil pode ser útil para chamar a atenção de um programador no código de suma importância.

Código Intermediário:

- Compilador pode melhorar loops, chamadas de procedimento e cálculos de endereço- Normalmente apenas compiladores otimizando incluir esta fase.

Código Alvo:

- Os compiladores podem usar registros com eficiência.- Transformação Peephole pode ser aplicado

Page 9: Compiladores - Otimização de código Intermediário

Tipos de OtimizaçãoTipos de Otimização

Remoção de sub-expressão comum.Remoção de sub-expressão comum. Otimização de Códigos MortosOtimização de Códigos Mortos Otimização de Loops.Otimização de Loops.

Page 10: Compiladores - Otimização de código Intermediário

Remoção de sub-expressão comum.Remoção de sub-expressão comum.

Remoção de sub-expressão comum é uma otimização que procura por ocorrências de expressões idênticas (ou seja, todos eles avaliar o mesmo valor), e as análises se vale a penas em substituir por uma única variável mantendo o valor calculado.

a=b * c + g

d=b * c * d

temp=b * c

a=temp + g

d=temp * d

Page 11: Compiladores - Otimização de código Intermediário

Eliminação de código morto é uma otimização do compilador que remove código que não afeta um programa. Remoção de tal código

tem duas vantagens encolhe o tamanho do programa, uma consideração importante em alguns contextos. Ele permite que o

programa em execução evitar a execução de operações irrelevantes, o que reduz seu tempo de execução.

Eliminação de código morto é de dois tipos:

- Código Inacessível

- Declaração redundante

Otimização de Código Morto

Page 12: Compiladores - Otimização de código Intermediário

Código Inacessivel

Em Programação de Computadores, código inacessível ou código morto é o código que existe no código fonte de um programa, mas nunca pode ser executado.

Program Code

If (a>b)

m=a

elseif (a<b)

m=b

elseif (a==b)

m=0

else

m=-1

Optimized Code

If (a>b)

m=a

elseif (a<b)

m=b

else

m=0

Page 13: Compiladores - Otimização de código Intermediário

Código redundante

Código redundante é o código que é executado mas não tem qualquer efeito sobre a saída a partir de um programa

main(){

int a,b,c,r;

a=5;

b=6;

c=a + b;

r=2;

r++;

printf(“%d”,c);

}

Adicionando complexidade de tempo e espaço

Page 14: Compiladores - Otimização de código Intermediário

Otimização de LoopOtimização de Loop

Otimização de Loop desempenha um papel importante na melhoria do desempenho do código fonte, reduzindo despesas gerais associadas com loops de execução.

Otimização de loop pode ser feito através da remoção:

- Loop invariante

- Variáveis de indução

Page 15: Compiladores - Otimização de código Intermediário

Loop InvarianteLoop Invariante

i = 1

s= 0

do{

s= s + i

a =5

i = i + 1

{

while (i < =n)

i = 1

s= 0

a =5

do{

s= s + i

i = i + 1

{

while (i < =n)

Trazendo a = 5

fazer fora do loop while, é chamado movimento de código.

Page 16: Compiladores - Otimização de código Intermediário

Variáveis de InduçãoVariáveis de Indução

i = 1

s= 0

S1=0

S2=0

while (i < =n)

{

s= s + a[ i ]

t1 = i * 4

s= s + b[ t1 ]

t2 = t1 +2

s2= s2 + c[ t2 ]

i = i + 1

}

i = 1

s= 0

S1=0

S2=0

t2=0

while (i < =n)

{

s= s + a[ i ]

t1 = t1+ 4

s= s + b[ t1 ]

s2= s2 + c[t1 +2 ]

i = i + 1

}

t1, t2 são variáveis de indução. i está induzindo t1 e t1 está induzindo t2

“+” replaced “ * ”, t1 was made independent of i

Page 17: Compiladores - Otimização de código Intermediário
Page 18: Compiladores - Otimização de código Intermediário
Page 19: Compiladores - Otimização de código Intermediário
Page 20: Compiladores - Otimização de código Intermediário
Page 21: Compiladores - Otimização de código Intermediário

Common Sub-expression RemovalCommon Sub-expression Removal

It is used to remove redundant computations which usually improves It is used to remove redundant computations which usually improves the execution time of a program.the execution time of a program.

Page 22: Compiladores - Otimização de código Intermediário
Page 23: Compiladores - Otimização de código Intermediário
Page 24: Compiladores - Otimização de código Intermediário
Page 25: Compiladores - Otimização de código Intermediário
Page 26: Compiladores - Otimização de código Intermediário
Page 27: Compiladores - Otimização de código Intermediário
Page 28: Compiladores - Otimização de código Intermediário

Three Address Code of Quick SortThree Address Code of Quick Sorti = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto (5) < v goto (5)

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto (9) > v goto (9)

if i >= j goto (23)if i >= j goto (23)

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

11

22

33

44

55

66

77

88

99

1010

1111

1212

1313

1414

1515

tt77 = 4 * I = 4 * I

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[ta[t77] = t] = t99

tt1010 = 4 * j = 4 * j

a[ta[t1010] = x] = x

goto (5)goto (5)

tt1111 = 4 * I = 4 * I

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

1616

1717

1818

1919

2020

2121

2222

2323

2424

2525

2626

2727

2828

2929

3030

Page 29: Compiladores - Otimização de código Intermediário

Find The Basic BlockFind The Basic Blocki = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto (5) < v goto (5)

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto (9) > v goto (9)

if i >= j goto (23)if i >= j goto (23)

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

11

22

33

44

55

66

77

88

99

1010

1111

1212

1313

1414

1515

tt77 = 4 * I = 4 * I

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[ta[t77] = t] = t99

tt1010 = 4 * j = 4 * j

a[ta[t1010] = x] = x

goto (5)goto (5)

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

1616

1717

1818

1919

2020

2121

2222

2323

2424

2525

2626

2727

2828

2929

3030

Page 30: Compiladores - Otimização de código Intermediário

Flow GraphFlow Graphi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt77 = 4 * i = 4 * i

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[ta[t77] = t] = t99

tt1010 = 4 * j = 4 * j

a[ta[t1010] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 31: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt77 = 4 * i = 4 * i

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[ta[t77] = t] = t99

tt1010 = 4 * j = 4 * j

a[ta[t1010] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 32: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

tt1010 = 4 * = 4 * jj

a[ta[t1010] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 33: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 *i = 4 *i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 34: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1212 = 4 * i = 4 * i

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[ta[t1212] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 35: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

tt1515 = 4 * n = 4 * n

a[ta[t1515] = x] = x

B1

B2

B3

B4

B5 B6

Page 36: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

a[a[tt1313] = x] = x

B1

B2

B3

B4

B5 B6

Page 37: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

tt6 6 = 4 * i = 4 * i

x = a[tx = a[t66]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt66] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

a[a[tt1313] = x] = x

B1

B2

B3

B4

B5 B6

Page 38: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

x = a[x = a[tt22]]

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt22] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

a[a[tt1313] = x] = x

B1

B2

B3

B4

B5 B6

Page 39: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

x = tx = t3 3

tt88 = 4 * j = 4 * j

tt99 = a[t = a[t88]]

a[a[tt22] = t] = t99

a[a[tt88] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

a[a[tt1313] = x] = x

B1

B2

B3

B4

B5 B6

Page 40: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

x = tx = t3 3

a[a[tt22] = t] = t55

a[a[tt44] = x] = x

goto Bgoto B22

tt1111 = 4 * i = 4 * i

x = a[tx = a[t1111]]

tt1313 = 4 * n = 4 * n

tt1414 = a[t = a[t1313]]

a[a[tt1111] = t] = t1414

a[a[tt1313] = x] = x

B1

B2

B3

B4

B5 B6

Page 41: Compiladores - Otimização de código Intermediário

Common Subexpression EliminationCommon Subexpression Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

x = tx = t3 3

a[a[tt22] = t] = t55

a[a[tt44] = x] = x

goto Bgoto B22

x = tx = t33

tt1414 = a[t = a[t11]]

a[a[tt22] = t] = t1414

a[a[tt11] = x] = x

B1

B2

B3

B4

B5 B6

Similarly for B6

Page 42: Compiladores - Otimização de código Intermediário

Dead Code EliminationDead Code Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

x = tx = t3 3

a[a[tt22] = t] = t55

a[a[tt44] = x] = x

goto Bgoto B22

x = tx = t33

tt1414 = a[t = a[t11]]

a[a[tt22] = t] = t1414

a[a[tt11] = x] = x

B1

B2

B3

B4

B5 B6

Page 43: Compiladores - Otimização de código Intermediário

Dead Code EliminationDead Code Eliminationi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

a[a[tt22] = t] = t55

a[a[tt44] = t] = t33

goto Bgoto B22

tt1414 = a[t = a[t11]]

a[a[tt22] = t] = t1414

a[a[tt11] = t] = t33

B1

B2

B3

B4

B5 B6

Page 44: Compiladores - Otimização de código Intermediário

Reduction in StrengthReduction in Strengthi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

i = i + 1i = i + 1

tt22 = 4 * i = 4 * i

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

j = j – 1j = j – 1

tt44 = 4 * j = 4 * j

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

a[a[tt22] = t] = t55

a[a[tt44] = t] = t33

goto Bgoto B22

tt1414 = a[t = a[t11]]

a[a[tt22] = t] = t1414

a[a[tt11] = t] = t33

B1

B2

B3

B4

B5 B6

Page 45: Compiladores - Otimização de código Intermediário

Reduction in StrengthReduction in Strengthi = m - 1i = m - 1

j = nj = n

tt1 1 =4 * n=4 * n

v = a[tv = a[t11]]

tt2 2 = 4 * i= 4 * i

tt44 = 4 * j = 4 * j

tt22 = t = t22 + 4 + 4

tt33 = a[t = a[t22]]

if tif t33 < v goto B < v goto B22

tt44 = t = t44 - 4 - 4

tt55 = a[t = a[t44]]

if tif t55 > v goto B > v goto B33

if i >= j goto B6

a[a[tt22] = t] = t55

a[a[tt44] = t] = t33

goto Bgoto B22

tt1414 = a[t = a[t11]]

a[a[tt22] = t] = t1414

a[a[tt11] = t] = t33

B1

B2

B3

B4

B5 B6