|
6 | 6 | //! Each optimization is a self-contained sub-module. The top-level |
7 | 7 | //! [`optimize_ir`] function runs all passes in order. |
8 | 8 |
|
9 | | -use crate::ir::LoweredModuleInfo; |
| 9 | +use crate::ir::{LoweredModuleInfo, ModuleInfo}; |
10 | 10 | use anyhow::Result; |
11 | 11 |
|
12 | 12 | // ── Passes ─────────────────────────────────────────────────────────────────── |
13 | 13 | mod dead_blocks; |
14 | 14 |
|
15 | | -/// Optimizes the IR representation by running all passes in order. |
| 15 | +/// Optimizes the pure SSA IR before phi lowering. |
16 | 16 | /// |
17 | | -/// Expects a [`LoweredModuleInfo`] — i.e. phi nodes have already been lowered |
18 | | -/// by [`crate::ir::lower_phis::lower`] before calling this function. |
19 | | -pub fn optimize_ir(module_info: LoweredModuleInfo) -> Result<LoweredModuleInfo> { |
| 17 | +/// Passes here operate on [`ModuleInfo`] with phi nodes still intact. |
| 18 | +/// Control-flow based passes (e.g. dead block elimination) belong here |
| 19 | +/// because reachability is identical in SSA and lowered form. |
| 20 | +pub fn optimize_ir(module_info: ModuleInfo, do_opt: bool) -> Result<ModuleInfo> { |
20 | 21 | let mut module_info = module_info; |
21 | | - for func in &mut module_info.ir_functions { |
22 | | - dead_blocks::eliminate(func)?; |
| 22 | + if do_opt { |
| 23 | + for func in &mut module_info.ir_functions { |
| 24 | + dead_blocks::eliminate(func)?; |
| 25 | + } |
23 | 26 | } |
24 | 27 | Ok(module_info) |
25 | 28 | } |
26 | 29 |
|
| 30 | +/// Optimizes the lowered IR after phi nodes have been eliminated. |
| 31 | +/// |
| 32 | +/// Passes here operate on [`LoweredModuleInfo`] where all `IrInstr::Phi` |
| 33 | +/// nodes have been replaced by `IrInstr::Assign` in predecessor blocks. |
| 34 | +pub fn optimize_lowered_ir( |
| 35 | + module_info: LoweredModuleInfo, |
| 36 | + _do_opt: bool, |
| 37 | +) -> Result<LoweredModuleInfo> { |
| 38 | + Ok(module_info) |
| 39 | +} |
| 40 | + |
27 | 41 | // ── optimize_ir integration tests ───────────────────────────────────────────── |
28 | 42 |
|
29 | 43 | #[cfg(test)] |
@@ -74,7 +88,7 @@ mod tests { |
74 | 88 | ..Default::default() |
75 | 89 | }; |
76 | 90 |
|
77 | | - let result = super::optimize_ir(crate::ir::lower_phis::lower(module)).unwrap(); |
| 91 | + let result = super::optimize_ir(module, true).unwrap(); |
78 | 92 | assert_eq!( |
79 | 93 | result.ir_functions[0].blocks.len(), |
80 | 94 | 1, |
|
0 commit comments