WIP.
This commit is contained in:
parent
3bde79a15d
commit
e6963b8d78
|
@ -20,13 +20,14 @@ pub struct WasmBackend<'a> {
|
||||||
|
|
||||||
impl<'a> WasmBackend<'a> {
|
impl<'a> WasmBackend<'a> {
|
||||||
pub fn new(body: &'a FunctionBody) -> Result<WasmBackend<'a>> {
|
pub fn new(body: &'a FunctionBody) -> Result<WasmBackend<'a>> {
|
||||||
|
log::debug!("Backend compiling:\n{}\n", body.display("| "));
|
||||||
let cfg = CFGInfo::new(body);
|
let cfg = CFGInfo::new(body);
|
||||||
let rpo = RPO::compute(body);
|
let rpo = RPO::compute(body);
|
||||||
log::trace!("RPO:\n{:?}\n", rpo);
|
log::debug!("RPO:\n{:?}\n", rpo);
|
||||||
let trees = Trees::compute(body);
|
let trees = Trees::compute(body);
|
||||||
log::trace!("Trees:\n{:?}\n", trees);
|
log::debug!("Trees:\n{:?}\n", trees);
|
||||||
let ctrl = StackifyContext::new(body, &cfg, &rpo)?.compute();
|
let ctrl = StackifyContext::new(body, &cfg, &rpo)?.compute();
|
||||||
log::trace!("Ctrl:\n{:?}\n", ctrl);
|
log::debug!("Ctrl:\n{:?}\n", ctrl);
|
||||||
Ok(WasmBackend {
|
Ok(WasmBackend {
|
||||||
body,
|
body,
|
||||||
rpo,
|
rpo,
|
||||||
|
|
|
@ -168,9 +168,17 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
.filter(|child| self.merge_nodes.contains(&child))
|
.filter(|child| self.merge_nodes.contains(&child))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
// Sort merge nodes so highest RPO number comes first.
|
// Sort merge nodes so highest RPO number comes first.
|
||||||
merge_node_children.sort_unstable_by_key(|&block| self.rpo.rev[block]);
|
merge_node_children.sort_unstable_by_key(|&block| std::cmp::Reverse(self.rpo.rev[block]));
|
||||||
|
|
||||||
let is_loop_header = self.loop_headers.contains(&block);
|
let is_loop_header = self.loop_headers.contains(&block);
|
||||||
|
|
||||||
|
log::trace!(
|
||||||
|
"handle_dom_subtree: block {} merge_nodes {:?} loop_header {}",
|
||||||
|
block,
|
||||||
|
merge_node_children,
|
||||||
|
is_loop_header
|
||||||
|
);
|
||||||
|
|
||||||
if is_loop_header {
|
if is_loop_header {
|
||||||
self.ctrl_stack.push(CtrlEntry::Loop { header: block });
|
self.ctrl_stack.push(CtrlEntry::Loop { header: block });
|
||||||
let mut body = vec![];
|
let mut body = vec![];
|
||||||
|
@ -186,6 +194,7 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_target(&self, target: Block) -> WasmLabel {
|
fn resolve_target(&self, target: Block) -> WasmLabel {
|
||||||
|
log::trace!("resolve_target: {} in stack {:?}", target, self.ctrl_stack);
|
||||||
WasmLabel(
|
WasmLabel(
|
||||||
u32::try_from(
|
u32::try_from(
|
||||||
self.ctrl_stack
|
self.ctrl_stack
|
||||||
|
@ -199,6 +208,7 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn do_branch(&mut self, source: Block, target: &'a BlockTarget, into: &mut Vec<WasmBlock<'a>>) {
|
fn do_branch(&mut self, source: Block, target: &'a BlockTarget, into: &mut Vec<WasmBlock<'a>>) {
|
||||||
|
log::trace!("do_branch: {} -> {:?}", source, target);
|
||||||
// This will be a branch to some entry in the control stack if
|
// This will be a branch to some entry in the control stack if
|
||||||
// the target is either a merge block, or is a backward branch
|
// the target is either a merge block, or is a backward branch
|
||||||
// (by RPO number).
|
// (by RPO number).
|
||||||
|
@ -231,6 +241,7 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
default: &'a BlockTarget,
|
default: &'a BlockTarget,
|
||||||
into: &mut Vec<WasmBlock<'a>>,
|
into: &mut Vec<WasmBlock<'a>>,
|
||||||
) {
|
) {
|
||||||
|
log::trace!("do_branch_select: {:?}, default {:?}", targets, default);
|
||||||
let mut body = vec![WasmBlock::Select {
|
let mut body = vec![WasmBlock::Select {
|
||||||
selector,
|
selector,
|
||||||
targets: (0..targets.len())
|
targets: (0..targets.len())
|
||||||
|
@ -271,6 +282,7 @@ impl<'a, 'b> Context<'a, 'b> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn node_within(&mut self, block: Block, merge_nodes: &[Block], into: &mut Vec<WasmBlock<'a>>) {
|
fn node_within(&mut self, block: Block, merge_nodes: &[Block], into: &mut Vec<WasmBlock<'a>>) {
|
||||||
|
log::trace!("node_within: block {} merge_nodes {:?}", block, merge_nodes);
|
||||||
if let Some((&first, rest)) = merge_nodes.split_first() {
|
if let Some((&first, rest)) = merge_nodes.split_first() {
|
||||||
self.ctrl_stack.push(CtrlEntry::Block { out: first });
|
self.ctrl_stack.push(CtrlEntry::Block { out: first });
|
||||||
let mut body = vec![];
|
let mut body = vec![];
|
||||||
|
|
Loading…
Reference in a new issue