Skip to content

feat(ir): adiciona passes de otimização sobre o TAC#154

Merged
Bappoz merged 5 commits into
developerfrom
issue133-tac-optimizations
Jun 21, 2026
Merged

feat(ir): adiciona passes de otimização sobre o TAC#154
Bappoz merged 5 commits into
developerfrom
issue133-tac-optimizations

Conversation

@guxvr

@guxvr guxvr commented Jun 20, 2026

Copy link
Copy Markdown
Collaborator

[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ão
de assembly.

Alterações

src/codegen/inter/optimizations.rs (novo)

Passe Descrição
constant_fold Avalia BinOp/UnOp com operandos Int constantes; protege UB em C (div/mod por zero, shifts inválidos)
constant_propagation Varredura forward propagando TempId → ConstValue; invalida em redefinições não-constantes
compute_liveness Análise de liveness backward sobre TempId
dead_code_eliminate Remove definições mortas sem side-effects
optimize_function Orquestrador de ponto fixo dos passes

src/codegen/inter/mod.rs

Expõe pub mod optimizations.

src/ir/lower.rs

Adiciona lower_and_optimize — envolve lower_program + optimize_function
por função; ponto de entrada recomendado para a pipeline de compilação.

Testes

20 testes unitários em #[cfg(test)] dentro de optimizations.rs:

  • Folding: aritmética, relacionais, bitwise, unário, guards de UB, bypass de Double
  • Propagation: substituição em cadeia, invalidação em redefinição
  • DCE: remoção de temporário morto, preservação de Call/Var, retenção de temporário vivo
  • Pipeline: convergência completa ao ponto fixo, preservação de side-effects
running 20 tests
test codegen::inter::optimizations::tests::dce_keeps_used_temp ... ok
test codegen::inter::optimizations::tests::dce_preserves_call_even_if_unused ... ok
test codegen::inter::optimizations::tests::dce_preserves_var_assignment ... ok
test codegen::inter::optimizations::tests::dce_removes_unused_temp ... ok
test codegen::inter::optimizations::tests::fold_add_two_consts ... ok
test codegen::inter::optimizations::tests::fold_bitwise_and ... ok
test codegen::inter::optimizations::tests::fold_div_by_zero_preserved ... ok
test codegen::inter::optimizations::tests::fold_double_operand_not_folded ... ok
test codegen::inter::optimizations::tests::fold_nested_expression ... ok
test codegen::inter::optimizations::tests::fold_relational_eq_false ... ok
test codegen::inter::optimizations::tests::fold_relational_less ... ok
test codegen::inter::optimizations::tests::fold_shl_negative_rhs_preserved ... ok
test codegen::inter::optimizations::tests::fold_shl_rhs_64_preserved ... ok
test codegen::inter::optimizations::tests::fold_unary_neg ... ok
test codegen::inter::optimizations::tests::fold_unary_not ... ok
test codegen::inter::optimizations::tests::optimize_function_full_pipeline ... ok
test codegen::inter::optimizations::tests::optimize_function_preserves_call_chain ... ok
test codegen::inter::optimizations::tests::optimize_function_side_effect_label_preserved ... ok
test codegen::inter::optimizations::tests::propagation_invalidated_by_redefinition ... ok
test codegen::inter::optimizations::tests::propagation_simple_chain ... ok

Observações

  • Atribuições a Operand::Var nunca são eliminadas (semântica observável de variáveis C)
  • ConstValue::Double é intencionalmente excluído do folding para evitar
    divergência de precisão de ponto flutuante entre host e target
  • Os passes existentes em src/codegen/inter/opt/ (sobre a representação Instruction)
    não foram alterados

Closes #133

…g, propagation e DCE

Implementa três passes de otimização intraprocessuais sobre Vec<TacInstr>
em src/codegen/inter/optimizations.rs
@guxvr guxvr requested a review from Bappoz June 20, 2026 16:48
@guxvr guxvr self-assigned this Jun 20, 2026
@guxvr guxvr added enhancement New feature or request test Optimization IR intermediate code generation labels Jun 20, 2026
guxvr and others added 4 commits June 20, 2026 13:53
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.
@Bappoz

Bappoz commented Jun 21, 2026

Copy link
Copy Markdown
Owner

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
análise por uma versão consciente de blocos básicos. Adicionei um teste de regressão (dce_keeps_def_used_only_after_if_else_merge) e a suíte completa (297
testes) passa.

@Bappoz Bappoz merged commit a870a3d into developer Jun 21, 2026
1 check passed
@Bappoz Bappoz deleted the issue133-tac-optimizations branch June 21, 2026 15:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request IR intermediate code generation Optimization test

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[IR-04] Otimizações básicas sobre TAC: constant folding e eliminação de código morto

2 participants