Skip to content
8 changes: 8 additions & 0 deletions crates/herkos/src/codegen/instruction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,14 @@ pub fn generate_instruction_with_info<B: Backend>(
val2,
condition,
} => backend.emit_select(*dest, *val1, *val2, *condition),

// Phi nodes must be lowered to Assign instructions by the lower_phis pass
// before codegen runs. Reaching this arm is a compiler bug.
IrInstr::Phi { .. } => {
unreachable!(
"IrInstr::Phi must be lowered before codegen (lower_phis pass missed this block)"
)
}
};
Ok(code)
}
Expand Down
11 changes: 7 additions & 4 deletions crates/herkos/src/codegen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ impl<'a, B: Backend> CodeGenerator<'a, B> {
/// Generate a complete Rust module from IR with full module info.
///
/// This is the main entry point. It generates a module wrapper structure.
pub fn generate_module_with_info(&self, info: &ModuleInfo) -> Result<String> {
pub fn generate_module_with_info(&self, info: &LoweredModuleInfo) -> Result<String> {
module::generate_module_with_info(self.backend, info)
}
}
Expand Down Expand Up @@ -500,7 +500,8 @@ mod tests {

let backend = SafeBackend::new();
let codegen = CodeGenerator::new(&backend);
let code = codegen.generate_module_with_info(&info).unwrap();
let lowered = crate::ir::lower_phis::lower(info);
let code = codegen.generate_module_with_info(&lowered).unwrap();

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

Expand Down Expand Up @@ -566,7 +567,8 @@ mod tests {

let backend = SafeBackend::new();
let codegen = CodeGenerator::new(&backend);
let code = codegen.generate_module_with_info(&info).unwrap();
let lowered = crate::ir::lower_phis::lower(info);
let code = codegen.generate_module_with_info(&lowered).unwrap();

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

Expand Down Expand Up @@ -633,7 +635,8 @@ mod tests {

let backend = SafeBackend::new();
let codegen = CodeGenerator::new(&backend);
let code = codegen.generate_module_with_info(&info).unwrap();
let lowered = crate::ir::lower_phis::lower(info);
let code = codegen.generate_module_with_info(&lowered).unwrap();

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

Expand Down
5 changes: 4 additions & 1 deletion crates/herkos/src/codegen/module.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ use anyhow::{Context, Result};
/// Generate a complete Rust module from IR functions with full module info.
///
/// This is the main entry point. It generates a module wrapper structure.
pub fn generate_module_with_info<B: Backend>(backend: &B, info: &ModuleInfo) -> Result<String> {
pub fn generate_module_with_info<B: Backend>(
backend: &B,
info: &LoweredModuleInfo,
) -> Result<String> {
generate_wrapper_module(backend, info)
}

Expand Down
Loading