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.