From 4f919c64602169fef9481fa5d1188befbbe327ed Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 6 May 2020 17:34:27 +0200 Subject: [PATCH] machinst: bump regalloc to 0.0.23 and return a slice on the successor indexes, in block_succs; --- Cargo.lock | 4 +-- cranelift/codegen/Cargo.toml | 2 +- cranelift/codegen/src/machinst/blockorder.rs | 4 +-- cranelift/codegen/src/machinst/vcode.rs | 30 +++++++++----------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62459c4e95..e775b2511c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1525,9 +1525,9 @@ dependencies = [ [[package]] name = "regalloc" -version = "0.0.22" +version = "0.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993953f6481fe355c490a0bdc2d488e354cd28728da36cd4156e2cfb74fd6de" +checksum = "b36727ea09f6e363ddebb29b2d2620052267cc1fc6e0da7da63317938eb4104c" dependencies = [ "log", "rustc-hash", diff --git a/cranelift/codegen/Cargo.toml b/cranelift/codegen/Cargo.toml index 7f78d4cce0..692c85bdd4 100644 --- a/cranelift/codegen/Cargo.toml +++ b/cranelift/codegen/Cargo.toml @@ -24,7 +24,7 @@ gimli = { version = "0.20.0", default-features = false, features = ["write"], op smallvec = { version = "1.0.0" } thiserror = "1.0.4" byteorder = { version = "1.3.2", default-features = false } -regalloc = "0.0.22" +regalloc = "0.0.23" # It is a goal of the cranelift-codegen crate to have minimal external dependencies. # Please don't add any unless they are essential to the task of creating binary # machine code. Integration tests that need external dependencies can be diff --git a/cranelift/codegen/src/machinst/blockorder.rs b/cranelift/codegen/src/machinst/blockorder.rs index 9c5060bc46..dd826809c4 100644 --- a/cranelift/codegen/src/machinst/blockorder.rs +++ b/cranelift/codegen/src/machinst/blockorder.rs @@ -22,8 +22,8 @@ impl BlockRPO { fn visit(&mut self, vcode: &VCode, block: BlockIndex) { self.visited[block as usize] = true; for succ in vcode.succs(block) { - if !self.visited[*succ as usize] { - self.visit(vcode, *succ); + if !self.visited[succ.get() as usize] { + self.visit(vcode, succ.get()); } } if Some(block) != vcode.fallthrough_return_block { diff --git a/cranelift/codegen/src/machinst/vcode.rs b/cranelift/codegen/src/machinst/vcode.rs index a4801bfe3e..ff9961aefa 100644 --- a/cranelift/codegen/src/machinst/vcode.rs +++ b/cranelift/codegen/src/machinst/vcode.rs @@ -29,7 +29,7 @@ use regalloc::{ }; use alloc::boxed::Box; -use alloc::vec::Vec; +use alloc::{borrow::Cow, vec::Vec}; use log::debug; use smallvec::SmallVec; use std::fmt; @@ -78,7 +78,7 @@ pub struct VCode { /// Block successor lists, concatenated into one Vec. The `block_succ_range` /// list of tuples above gives (start, end) ranges within this list that /// correspond to each basic block's successors. - block_succs: Vec, + block_succs: Vec, /// Block indices by IR block. block_by_bb: SecondaryMap, @@ -237,15 +237,15 @@ impl VCodeBuilder { match insn.is_term() { MachTerminator::None | MachTerminator::Ret => {} MachTerminator::Uncond(target) => { - self.vcode.block_succs.push(target); + self.vcode.block_succs.push(BlockIx::new(target)); } MachTerminator::Cond(true_branch, false_branch) => { - self.vcode.block_succs.push(true_branch); - self.vcode.block_succs.push(false_branch); + self.vcode.block_succs.push(BlockIx::new(true_branch)); + self.vcode.block_succs.push(BlockIx::new(false_branch)); } MachTerminator::Indirect(targets) => { for target in targets { - self.vcode.block_succs.push(*target); + self.vcode.block_succs.push(BlockIx::new(*target)); } } } @@ -358,7 +358,7 @@ impl VCode { } /// Get the successors for a block. - pub fn succs(&self, block: BlockIndex) -> &[BlockIndex] { + pub fn succs(&self, block: BlockIndex) -> &[BlockIx] { let (start, end) = self.block_succ_range[block as usize]; &self.block_succs[start..end] } @@ -489,8 +489,8 @@ impl VCode { // Rewrite successor information based on the block-rewrite map. for succ in &mut self.block_succs { - let new_succ = block_rewrites[*succ as usize]; - *succ = new_succ; + let new_succ = block_rewrites[succ.get() as usize]; + *succ = BlockIx::new(new_succ); } } @@ -643,13 +643,9 @@ impl RegallocFunction for VCode { Range::new(InstIx::new(start), (end - start) as usize) } - fn block_succs(&self, block: BlockIx) -> Vec { + fn block_succs(&self, block: BlockIx) -> Cow<[BlockIx]> { let (start, end) = self.block_succ_range[block.get() as usize]; - self.block_succs[start..end] - .iter() - .cloned() - .map(BlockIx::new) - .collect() + Cow::Borrowed(&self.block_succs[start..end]) } fn is_ret(&self, insn: InstIx) -> bool { @@ -721,7 +717,7 @@ impl fmt::Debug for VCode { for block in 0..self.num_blocks() { writeln!(f, "Block {}:", block,)?; for succ in self.succs(block as BlockIndex) { - writeln!(f, " (successor: Block {})", succ)?; + writeln!(f, " (successor: Block {})", succ.get())?; } let (start, end) = self.block_ranges[block]; writeln!(f, " (instruction range: {} .. {})", start, end)?; @@ -783,7 +779,7 @@ impl ShowWithRRU for VCode { write!(&mut s, " (original IR block: {})\n", bb).unwrap(); } for succ in self.succs(block as BlockIndex) { - write!(&mut s, " (successor: Block {})\n", succ).unwrap(); + write!(&mut s, " (successor: Block {})\n", succ.get()).unwrap(); } let (start, end) = self.block_ranges[block]; write!(&mut s, " (instruction range: {} .. {})\n", start, end).unwrap();