Allow register allocation to fail

This commit is contained in:
Jef
2019-04-17 15:13:38 +02:00
parent 762cd3fb32
commit ced654f907
2 changed files with 282 additions and 204 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -83,6 +83,7 @@ where
M: ModuleContext, M: ModuleContext,
I: IntoIterator<Item = Operator<L>>, I: IntoIterator<Item = Operator<L>>,
L: Hash + Clone + Eq, L: Hash + Clone + Eq,
BrTarget<L>: std::fmt::Display,
{ {
fn drop_elements<T>(stack: &mut Vec<T>, depths: std::ops::RangeInclusive<u32>) { fn drop_elements<T>(stack: &mut Vec<T>, depths: std::ops::RangeInclusive<u32>) {
let _ = (|| { let _ = (|| {
@@ -138,6 +139,8 @@ where
); );
while let Some(op) = body.next() { while let Some(op) = body.next() {
println!("{}", op);
if let Some(Operator::Label(label)) = body.peek() { if let Some(Operator::Label(label)) = body.peek() {
let block = blocks let block = blocks
.get_mut(&BrTarget::Label(label.clone())) .get_mut(&BrTarget::Label(label.clone()))
@@ -324,33 +327,46 @@ where
(ref mut else_cc @ None, else_to_drop), (ref mut else_cc @ None, else_to_drop),
) => { ) => {
let max_params = then_block.params.max(else_block.params); let max_params = then_block.params.max(else_block.params);
let cc = if then_block_should_serialize_args { let virt_cc = if !then_block_should_serialize_args
Left(ctx.serialize_args(max_params)) || !else_block_should_serialize_args
} else if else_block_should_serialize_args { {
Left(ctx.serialize_args(max_params)) Some(ctx.virtual_calling_convention())
} else { } else {
Right(ctx.virtual_calling_convention()) None
};
let cc = if then_block_should_serialize_args
|| else_block_should_serialize_args
{
Some(ctx.serialize_args(max_params))
} else {
None
}; };
**then_cc = { **then_cc = if then_block_should_serialize_args {
let mut cc = cc.clone(); let mut cc = cc.clone().unwrap();
if let Some(to_drop) = then_to_drop.clone() { if let Some(to_drop) = then_to_drop.clone() {
match &mut cc { drop_elements(&mut cc.arguments, to_drop);
Left(cc) => drop_elements(&mut cc.arguments, to_drop),
Right(cc) => drop_elements(&mut cc.stack, to_drop),
} }
Some(Left(cc))
} else {
let mut cc = virt_cc.clone().unwrap();
if let Some(to_drop) = then_to_drop.clone() {
drop_elements(&mut cc.stack, to_drop);
} }
Some(cc) Some(Right(cc))
}; };
**else_cc = { **else_cc = if else_block_should_serialize_args {
let mut cc = cc; let mut cc = cc.unwrap();
if let Some(to_drop) = else_to_drop.clone() { if let Some(to_drop) = else_to_drop.clone() {
match &mut cc { drop_elements(&mut cc.arguments, to_drop);
Left(cc) => drop_elements(&mut cc.arguments, to_drop),
Right(cc) => drop_elements(&mut cc.stack, to_drop),
} }
Some(Left(cc))
} else {
let mut cc = virt_cc.unwrap();
if let Some(to_drop) = else_to_drop.clone() {
drop_elements(&mut cc.stack, to_drop);
} }
Some(cc) Some(Right(cc))
}; };
} }
_ => unimplemented!( _ => unimplemented!(