feat(ir): adiciona passes de otimização sobre o TAC#154
Conversation
…g, propagation e DCE Implementa três passes de otimização intraprocessuais sobre Vec<TacInstr> em src/codegen/inter/optimizations.rs
A análise de liveness usava varredura linear backward sobre toda a função, ignorando Jump/CondJump/Label. Isso fazia o DCE eliminar definições feitas em um ramo de if/else quando o uso só ocorria após o merge (ex: t0=5 em um then seguido de goto, com t0 lido depois do else) — um bug de corretude que apaga código observável. Substitui por liveness por blocos básicos com fixpoint entre blocos (live_in/live_out via predecessores/sucessores reais), refinando depois por instrução dentro de cada bloco. Adiciona teste de regressão.
|
Revisei o PR #154 e encontrei um bug real de corretude: a análise de liveness usada pelo DCE fazia uma varredura linear única de trás para frente sobre toda a função, ignorando completamente Jump/CondJump/Label — ou seja, tratava o código como se não houvesse fluxo de controle. Isso fazia o DCE remover indevidamente atribuições feitas em um ramo de if/else (ou em loops) quando o uso só ocorria após o merge dos ramos, apagando código observável e quebrando a semântica do programa compilado. Reproduzi o bug com um teste isolado (confirmado falhando no código original) e corrigi substituindo a |
[IR-04] Passes de otimização sobre o TAC: constant folding, propagation e DCE
Resumo
Implementa as otimizações básicas sobre o TAC descritas na issue #133,
operando sobre
Vec<TacInstr>após o lowering da AST e antes da emissãode assembly.
Alterações
src/codegen/inter/optimizations.rs(novo)constant_foldBinOp/UnOpcom operandosIntconstantes; protege UB em C (div/mod por zero, shifts inválidos)constant_propagationTempId → ConstValue; invalida em redefinições não-constantescompute_livenessTempIddead_code_eliminateoptimize_functionsrc/codegen/inter/mod.rsExpõe
pub mod optimizations.src/ir/lower.rsAdiciona
lower_and_optimize— envolvelower_program+optimize_functionpor função; ponto de entrada recomendado para a pipeline de compilação.
Testes
20 testes unitários em
#[cfg(test)]dentro deoptimizations.rs:Observações
Operand::Varnunca são eliminadas (semântica observável de variáveis C)ConstValue::Doubleé intencionalmente excluído do folding para evitardivergência de precisão de ponto flutuante entre host e target
src/codegen/inter/opt/(sobre a representaçãoInstruction)não foram alterados
Closes #133