Add RetVoid just in case
This commit is contained in:
parent
94c4ec0613
commit
1aa9b3e76c
@ -269,6 +269,7 @@ impl Builder {
|
||||
if let Some(term) = &other.data.terminator {
|
||||
match term {
|
||||
TerminatorKind::Ret(_) => {}
|
||||
TerminatorKind::RetVoid => {}
|
||||
TerminatorKind::Br(other_val) => {
|
||||
if other_val == &block_v {
|
||||
return true;
|
||||
@ -372,6 +373,7 @@ impl TerminatorKind {
|
||||
use TerminatorKind::*;
|
||||
match self {
|
||||
Ret(instr_val) => instr_val.get_type(builder),
|
||||
RetVoid => Ok(Type::Void),
|
||||
Br(_) => Ok(Type::Void),
|
||||
CondBr(_, _, _) => Ok(Type::Void),
|
||||
}
|
||||
|
@ -356,6 +356,7 @@ impl TerminatorKind {
|
||||
let value = module.values.get(val).unwrap();
|
||||
LLVMBuildRet(module.builder_ref, value.value_ref)
|
||||
}
|
||||
TerminatorKind::RetVoid => LLVMBuildRetVoid(module.builder_ref),
|
||||
TerminatorKind::Br(block_value) => {
|
||||
let dest = *module.blocks.get(block_value).unwrap();
|
||||
LLVMBuildBr(module.builder_ref, dest)
|
||||
|
@ -145,6 +145,7 @@ impl Debug for TerminatorKind {
|
||||
write!(f, "Ret ")?;
|
||||
val.fmt(f)
|
||||
}
|
||||
Self::RetVoid => write!(f, "Void Ret"),
|
||||
Self::Br(val) => {
|
||||
write!(f, "Br ")?;
|
||||
val.fmt(f)
|
||||
|
@ -132,12 +132,14 @@ impl<'builder> Block<'builder> {
|
||||
unsafe { self.builder.terminate(&self.value, instruction) }
|
||||
}
|
||||
|
||||
pub fn delete_if_unused(&mut self) -> Result<(), ()> {
|
||||
/// Delete block if it is unused. Return true if deleted, false if not.
|
||||
pub fn delete_if_unused(&mut self) -> Result<bool, ()> {
|
||||
unsafe {
|
||||
if !self.builder.is_block_used(self.value()) {
|
||||
self.builder.delete_block(&self.value)
|
||||
self.builder.delete_block(&self.value)?;
|
||||
Ok(true)
|
||||
} else {
|
||||
Ok(())
|
||||
Ok(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -212,6 +214,7 @@ pub enum ConstValue {
|
||||
#[derive(Clone, Hash)]
|
||||
pub enum TerminatorKind {
|
||||
Ret(InstructionValue),
|
||||
RetVoid,
|
||||
Br(BlockValue),
|
||||
CondBr(InstructionValue, BlockValue, BlockValue),
|
||||
}
|
||||
|
@ -90,7 +90,11 @@ impl mir::Module {
|
||||
if let Some(ret) = block.codegen(&mut scope) {
|
||||
scope.block.terminate(Term::Ret(ret)).unwrap();
|
||||
} else {
|
||||
scope.block.delete_if_unused().unwrap();
|
||||
if !scope.block.delete_if_unused().unwrap() {
|
||||
// Add a void return just in case if the block
|
||||
// wasn't unused but didn't have a terminator yet
|
||||
scope.block.terminate(Term::RetVoid).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
mir::FunctionDefinitionKind::Extern => {}
|
||||
|
Loading…
Reference in New Issue
Block a user