Aula 25: Otimizações Globais

Objetivos

  • Aplicar otimizações independentes de arquitetura.
  • Otimização de Loops (LICM).

Conteúdo

A maioria do tempo de execução de um programa é gasto em laços (Loops). Portanto, otimizar loops é a prioridade #1.

Loop Invariant Code Motion (LICM)

Mover código que não muda dentro do loop para fora (pré-cabeçalho).

while(i < N) {
  x = y + z; // y e z não mudam no loop
  a[i] = x * i;
}

Vira:

t1 = y + z;
while(i < N) {
  a[i] = t1 * i;
}

Function Inlining

Substituir a chamada de uma função pelo corpo dela. - Vantagens: Elimina overhead de call/ret, de empilhar parâmetros e permite otimizações inter-procedurais (ex: constant folding nos argumentos). - Desvantagem: Aumenta o tamanho do binário (Code Bloat).

Dead Code Elimination (Global)

Se uma variável é definida mas nunca está “Viva” (Liveness Analysis), a instrução que a define pode ser removida. Isso acontece muito após outras otimizações (ex: após Constant Folding, um branch if (false) morre, e código dentro dele vira Dead Code).

Referências

  • Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
  • Cooper, K., & Torczon, L. (2011). Engineering a Compiler.
Back to top