Refactor
This commit is contained in:
parent
925c57be9e
commit
0947940c43
9
src/backend/locations.rs
Normal file
9
src/backend/locations.rs
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
//! Location assignment (pseudo-regalloc) for SSA values onto
|
||||||
|
//! locals/operand-stack values.
|
||||||
|
|
||||||
|
use crate::LocalId;
|
||||||
|
|
||||||
|
pub enum Location {
|
||||||
|
Local(LocalId),
|
||||||
|
// TODO: use operand stack
|
||||||
|
}
|
|
@ -2,3 +2,5 @@
|
||||||
|
|
||||||
mod stackify;
|
mod stackify;
|
||||||
pub(crate) use stackify::*;
|
pub(crate) use stackify::*;
|
||||||
|
mod locations;
|
||||||
|
pub(crate) use locations::*;
|
||||||
|
|
|
@ -554,7 +554,7 @@ impl<'a, 'b> FunctionBodyBuilder<'a, 'b> {
|
||||||
match &op {
|
match &op {
|
||||||
wasmparser::Operator::Unreachable => {
|
wasmparser::Operator::Unreachable => {
|
||||||
if let Some(block) = self.cur_block {
|
if let Some(block) = self.cur_block {
|
||||||
self.body.blocks[block].terminator = Terminator::None;
|
self.body.end_block(block, Terminator::None);
|
||||||
self.locals.finish_block();
|
self.locals.finish_block();
|
||||||
}
|
}
|
||||||
self.cur_block = None;
|
self.cur_block = None;
|
||||||
|
@ -1033,12 +1033,11 @@ impl<'a, 'b> FunctionBodyBuilder<'a, 'b> {
|
||||||
);
|
);
|
||||||
if let Some(block) = self.cur_block {
|
if let Some(block) = self.cur_block {
|
||||||
let args = args.to_vec();
|
let args = args.to_vec();
|
||||||
self.body.add_edge(block, target);
|
|
||||||
let target = BlockTarget {
|
let target = BlockTarget {
|
||||||
block: target,
|
block: target,
|
||||||
args,
|
args,
|
||||||
};
|
};
|
||||||
self.body.blocks[block].terminator = Terminator::Br { target };
|
self.body.end_block(block, Terminator::Br { target });
|
||||||
self.cur_block = None;
|
self.cur_block = None;
|
||||||
self.locals.finish_block();
|
self.locals.finish_block();
|
||||||
}
|
}
|
||||||
|
@ -1063,19 +1062,20 @@ impl<'a, 'b> FunctionBodyBuilder<'a, 'b> {
|
||||||
if let Some(block) = self.cur_block {
|
if let Some(block) = self.cur_block {
|
||||||
let if_true_args = if_true_args.to_vec();
|
let if_true_args = if_true_args.to_vec();
|
||||||
let if_false_args = if_false_args.to_vec();
|
let if_false_args = if_false_args.to_vec();
|
||||||
self.body.blocks[block].terminator = Terminator::CondBr {
|
self.body.end_block(
|
||||||
cond,
|
block,
|
||||||
if_true: BlockTarget {
|
Terminator::CondBr {
|
||||||
block: if_true,
|
cond,
|
||||||
args: if_true_args,
|
if_true: BlockTarget {
|
||||||
|
block: if_true,
|
||||||
|
args: if_true_args,
|
||||||
|
},
|
||||||
|
if_false: BlockTarget {
|
||||||
|
block: if_false,
|
||||||
|
args: if_false_args,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
if_false: BlockTarget {
|
);
|
||||||
block: if_false,
|
|
||||||
args: if_false_args,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
self.body.add_edge(block, if_true);
|
|
||||||
self.body.add_edge(block, if_false);
|
|
||||||
self.cur_block = None;
|
self.cur_block = None;
|
||||||
self.locals.finish_block();
|
self.locals.finish_block();
|
||||||
}
|
}
|
||||||
|
@ -1112,16 +1112,14 @@ impl<'a, 'b> FunctionBodyBuilder<'a, 'b> {
|
||||||
args: default_args,
|
args: default_args,
|
||||||
};
|
};
|
||||||
|
|
||||||
for &target in indexed_targets {
|
self.body.end_block(
|
||||||
self.body.add_edge(block, target);
|
block,
|
||||||
}
|
Terminator::Select {
|
||||||
self.body.add_edge(block, default_target);
|
value: index,
|
||||||
|
targets,
|
||||||
self.body.blocks[block].terminator = Terminator::Select {
|
default,
|
||||||
value: index,
|
},
|
||||||
targets,
|
);
|
||||||
default,
|
|
||||||
};
|
|
||||||
self.cur_block = None;
|
self.cur_block = None;
|
||||||
self.locals.finish_block();
|
self.locals.finish_block();
|
||||||
}
|
}
|
||||||
|
@ -1130,7 +1128,7 @@ impl<'a, 'b> FunctionBodyBuilder<'a, 'b> {
|
||||||
fn emit_ret(&mut self, values: &[Value]) {
|
fn emit_ret(&mut self, values: &[Value]) {
|
||||||
if let Some(block) = self.cur_block {
|
if let Some(block) = self.cur_block {
|
||||||
let values = values.to_vec();
|
let values = values.to_vec();
|
||||||
self.body.blocks[block].terminator = Terminator::Return { values };
|
self.body.end_block(block, Terminator::Return { values });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ impl FunctionBody {
|
||||||
assert_ne!(to, Value::undef());
|
assert_ne!(to, Value::undef());
|
||||||
log::trace!("set_alias: value {:?} to {:?}", value, to);
|
log::trace!("set_alias: value {:?} to {:?}", value, to);
|
||||||
// Resolve the `to` value through all existing aliases.
|
// Resolve the `to` value through all existing aliases.
|
||||||
let to = self.resolve_alias(to);
|
let to = self.resolve_and_update_alias(to);
|
||||||
// Disallow cycles.
|
// Disallow cycles.
|
||||||
if to == value {
|
if to == value {
|
||||||
panic!("Cannot create an alias cycle");
|
panic!("Cannot create an alias cycle");
|
||||||
|
|
Loading…
Reference in a new issue