Skip to content

Commit f49d270

Browse files
authored
Merge pull request #16 from arnoox/feat/ssa-foundation
IR: ssa-foundation: ensure strict SSA
2 parents 541c9f9 + 5279b19 commit f49d270

10 files changed

Lines changed: 1772 additions & 491 deletions

File tree

crates/herkos/src/codegen/instruction.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ pub fn generate_instruction_with_info<B: Backend>(
103103
val2,
104104
condition,
105105
} => backend.emit_select(*dest, *val1, *val2, *condition),
106+
107+
// Phi nodes must be lowered to Assign instructions by the lower_phis pass
108+
// before codegen runs. Reaching this arm is a compiler bug.
109+
IrInstr::Phi { .. } => {
110+
unreachable!(
111+
"IrInstr::Phi must be lowered before codegen (lower_phis pass missed this block)"
112+
)
113+
}
106114
};
107115
Ok(code)
108116
}

crates/herkos/src/codegen/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ impl<'a, B: Backend> CodeGenerator<'a, B> {
165165
/// Generate a complete Rust module from IR with full module info.
166166
///
167167
/// This is the main entry point. It generates a module wrapper structure.
168-
pub fn generate_module_with_info(&self, info: &ModuleInfo) -> Result<String> {
168+
pub fn generate_module_with_info(&self, info: &LoweredModuleInfo) -> Result<String> {
169169
module::generate_module_with_info(self.backend, info)
170170
}
171171
}
@@ -500,7 +500,8 @@ mod tests {
500500

501501
let backend = SafeBackend::new();
502502
let codegen = CodeGenerator::new(&backend);
503-
let code = codegen.generate_module_with_info(&info).unwrap();
503+
let lowered = crate::ir::lower_phis::lower(info);
504+
let code = codegen.generate_module_with_info(&lowered).unwrap();
504505

505506
println!("Generated wrapper code:\n{}", code);
506507

@@ -566,7 +567,8 @@ mod tests {
566567

567568
let backend = SafeBackend::new();
568569
let codegen = CodeGenerator::new(&backend);
569-
let code = codegen.generate_module_with_info(&info).unwrap();
570+
let lowered = crate::ir::lower_phis::lower(info);
571+
let code = codegen.generate_module_with_info(&lowered).unwrap();
570572

571573
println!("Generated wrapper code:\n{}", code);
572574

@@ -633,7 +635,8 @@ mod tests {
633635

634636
let backend = SafeBackend::new();
635637
let codegen = CodeGenerator::new(&backend);
636-
let code = codegen.generate_module_with_info(&info).unwrap();
638+
let lowered = crate::ir::lower_phis::lower(info);
639+
let code = codegen.generate_module_with_info(&lowered).unwrap();
637640

638641
println!("Generated code with immutable global:\n{}", code);
639642

crates/herkos/src/codegen/module.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ use anyhow::{Context, Result};
1515
/// Generate a complete Rust module from IR functions with full module info.
1616
///
1717
/// This is the main entry point. It generates a module wrapper structure.
18-
pub fn generate_module_with_info<B: Backend>(backend: &B, info: &ModuleInfo) -> Result<String> {
18+
pub fn generate_module_with_info<B: Backend>(
19+
backend: &B,
20+
info: &LoweredModuleInfo,
21+
) -> Result<String> {
1922
generate_wrapper_module(backend, info)
2023
}
2124

0 commit comments

Comments
 (0)