From 49bc994353185eff1b78260c971ff6fa8c2f0811 Mon Sep 17 00:00:00 2001 From: Rerumu Date: Thu, 7 Jul 2022 19:30:41 -0400 Subject: [PATCH] Elide block labels when not referenced --- codegen/luajit/src/backend/statement.rs | 50 +++++++------- codegen/luau/src/backend/manager.rs | 14 ++-- codegen/luau/src/backend/statement.rs | 90 ++++++++++--------------- wasm-ast/src/factory.rs | 51 ++++++++------ wasm-ast/src/node.rs | 43 +++++------- wasm-ast/src/visit.rs | 31 ++------- 6 files changed, 116 insertions(+), 163 deletions(-) diff --git a/codegen/luajit/src/backend/statement.rs b/codegen/luajit/src/backend/statement.rs index d3d86dc..1b5ea30 100644 --- a/codegen/luajit/src/backend/statement.rs +++ b/codegen/luajit/src/backend/statement.rs @@ -4,7 +4,7 @@ use std::{ }; use wasm_ast::node::{ - Backward, Br, BrIf, BrTable, Call, CallIndirect, Forward, FuncData, If, MemoryGrow, SetGlobal, + Block, Br, BrIf, BrTable, Call, CallIndirect, FuncData, If, LabelType, MemoryGrow, SetGlobal, SetLocal, SetTemporary, Statement, StoreAt, Terminator, }; use wasmparser::ValType; @@ -117,41 +117,38 @@ impl Driver for Terminator { } } -impl Driver for Forward { - fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { - let label = mng.push_label(); +fn write_inner_block(block: &Block, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { + block.code().iter().try_for_each(|s| s.write(mng, w))?; - self.code().iter().try_for_each(|s| s.write(mng, w))?; - - if let Some(v) = self.last() { - v.write(mng, w)?; - } - - write!(w, "::continue_at_{label}::")?; - - mng.pop_label(); - - Ok(()) + match block.last() { + Some(v) => v.write(mng, w), + None => Ok(()), } } -impl Driver for Backward { +impl Driver for Block { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { let label = mng.push_label(); - write!(w, "::continue_at_{label}::")?; - write!(w, "while true do ")?; + match self.label_type() { + Some(LabelType::Forward) => { + write_inner_block(self, mng, w)?; + write!(w, "::continue_at_{label}::")?; + } + Some(LabelType::Backward) => { + write!(w, "::continue_at_{label}::")?; + write!(w, "while true do ")?; + write_inner_block(self, mng, w)?; - self.code().iter().try_for_each(|s| s.write(mng, w))?; + if self.last().is_none() { + write!(w, "break ")?; + } - if let Some(v) = self.last() { - v.write(mng, w)?; - } else { - write!(w, "break ")?; + write!(w, "end ")?; + } + None => write_inner_block(self, mng, w)?, } - write!(w, "end ")?; - mng.pop_label(); Ok(()) @@ -268,8 +265,7 @@ impl Driver for MemoryGrow { impl Driver for Statement { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { match self { - Self::Forward(s) => s.write(mng, w), - Self::Backward(s) => s.write(mng, w), + Self::Block(s) => s.write(mng, w), Self::BrIf(s) => s.write(mng, w), Self::If(s) => s.write(mng, w), Self::Call(s) => s.write(mng, w), diff --git a/codegen/luau/src/backend/manager.rs b/codegen/luau/src/backend/manager.rs index 182be4c..9c09086 100644 --- a/codegen/luau/src/backend/manager.rs +++ b/codegen/luau/src/backend/manager.rs @@ -4,20 +4,14 @@ use std::{ ops::Range, }; -use wasm_ast::node::{BrTable, CmpOp, Expression}; +use wasm_ast::node::{BrTable, CmpOp, Expression, LabelType}; use crate::analyzer::as_symbol::AsSymbol; -#[derive(PartialEq, Eq)] -pub enum Label { - Forward, - Backward, -} - #[derive(Default)] pub struct Manager { table_map: HashMap, - label_list: Vec