diff --git a/cranelift/peepmatic/crates/automata/src/output_impls.rs b/cranelift/peepmatic/crates/automata/src/output_impls.rs index 6701f7d867..308c466d5b 100644 --- a/cranelift/peepmatic/crates/automata/src/output_impls.rs +++ b/cranelift/peepmatic/crates/automata/src/output_impls.rs @@ -57,6 +57,43 @@ where } } +impl Output for Box<[T]> +where + T: Clone + Eq + Hash, +{ + fn empty() -> Self { + vec![].into_boxed_slice() + } + + fn is_empty(&self) -> bool { + self.len() == 0 + } + + fn prefix(a: &Self, b: &Self) -> Self { + a.iter() + .cloned() + .zip(b.iter().cloned()) + .take_while(|(a, b)| a == b) + .map(|(a, _)| a) + .collect() + } + + fn difference(a: &Self, b: &Self) -> Self { + let i = a + .iter() + .zip(b.iter()) + .position(|(a, b)| a != b) + .unwrap_or(cmp::min(a.len(), b.len())); + a[i..].to_vec().into_boxed_slice() + } + + fn concat(a: &Self, b: &Self) -> Self { + let mut c = a.clone().to_vec(); + c.extend(b.iter().cloned()); + c.into_boxed_slice() + } +} + #[cfg(test)] mod tests { use crate::Output; diff --git a/cranelift/peepmatic/crates/runtime/src/optimizations.rs b/cranelift/peepmatic/crates/runtime/src/optimizations.rs index 4ed66a8a12..ff838ff720 100644 --- a/cranelift/peepmatic/crates/runtime/src/optimizations.rs +++ b/cranelift/peepmatic/crates/runtime/src/optimizations.rs @@ -29,7 +29,7 @@ pub struct PeepholeOptimizations { /// The underlying automata for matching optimizations' left-hand sides, and /// building up the corresponding right-hand side. - pub automata: Automaton>, + pub automata: Automaton>, } impl PeepholeOptimizations { diff --git a/cranelift/peepmatic/src/automatize.rs b/cranelift/peepmatic/src/automatize.rs index 5b96339f9f..de053c5574 100644 --- a/cranelift/peepmatic/src/automatize.rs +++ b/cranelift/peepmatic/src/automatize.rs @@ -6,10 +6,10 @@ use peepmatic_runtime::linear; /// Construct an automaton from a set of linear optimizations. pub fn automatize( opts: &linear::Optimizations, -) -> Automaton> { +) -> Automaton> { debug_assert!(crate::linear_passes::is_sorted_lexicographically(opts)); - let mut builder = Builder::>::new(); + let mut builder = Builder::>::new(); for opt in &opts.optimizations { let mut insertion = builder.insert(); @@ -22,7 +22,7 @@ pub fn automatize( insertion.set_state_data(inc.operation); } - insertion.next(inc.expected, inc.actions.clone()); + insertion.next(inc.expected, inc.actions.clone().into_boxed_slice()); } insertion.finish(); } diff --git a/cranelift/peepmatic/src/dot_fmt.rs b/cranelift/peepmatic/src/dot_fmt.rs index 1d854d6561..6939577147 100644 --- a/cranelift/peepmatic/src/dot_fmt.rs +++ b/cranelift/peepmatic/src/dot_fmt.rs @@ -17,7 +17,7 @@ use std::num::NonZeroU16; #[derive(Debug)] pub(crate) struct PeepholeDotFmt<'a>(pub(crate) &'a PathInterner, pub(crate) &'a IntegerInterner); -impl DotFmt> for PeepholeDotFmt<'_> { +impl DotFmt> for PeepholeDotFmt<'_> { fn fmt_transition( &self, w: &mut impl Write, @@ -73,7 +73,7 @@ impl DotFmt> for Peeph writeln!(w, "") } - fn fmt_output(&self, w: &mut impl Write, actions: &Vec) -> io::Result<()> { + fn fmt_output(&self, w: &mut impl Write, actions: &Box<[linear::Action]>) -> io::Result<()> { use linear::Action::*; if actions.is_empty() { @@ -84,7 +84,7 @@ impl DotFmt> for Peeph let p = p(self.0); - for a in actions { + for a in actions.iter() { match a { GetLhs { path } => write!(w, "get-lhs @ {}
", p(path))?, UnaryUnquote { operator, operand } => {