Mass rename Ebb and relatives to Block (#1365)
* Manually rename BasicBlock to BlockPredecessor BasicBlock is a pair of (Ebb, Inst) that is used to represent the basic block subcomponent of an Ebb that is a predecessor to an Ebb. Eventually we will be able to remove this struct, but for now it makes sense to give it a non-conflicting name so that we can start to transition Ebb to represent a basic block. I have not updated any comments that refer to BasicBlock, as eventually we will remove BlockPredecessor and replace with Block, which is a basic block, so the comments will become correct. * Manually rename SSABuilder block types to avoid conflict SSABuilder has its own Block and BlockData types. These along with associated identifier will cause conflicts in a later commit, so they are renamed to be more verbose here. * Automatically rename 'Ebb' to 'Block' in *.rs * Automatically rename 'EBB' to 'block' in *.rs * Automatically rename 'ebb' to 'block' in *.rs * Automatically rename 'extended basic block' to 'basic block' in *.rs * Automatically rename 'an basic block' to 'a basic block' in *.rs * Manually update comment for `Block` `Block`'s wikipedia article required an update. * Automatically rename 'an `Block`' to 'a `Block`' in *.rs * Automatically rename 'extended_basic_block' to 'basic_block' in *.rs * Automatically rename 'ebb' to 'block' in *.clif * Manually rename clif constant that contains 'ebb' as substring to avoid conflict * Automatically rename filecheck uses of 'EBB' to 'BB' 'regex: EBB' -> 'regex: BB' '$EBB' -> '$BB' * Automatically rename 'EBB' 'Ebb' to 'block' in *.clif * Automatically rename 'an block' to 'a block' in *.clif * Fix broken testcase when function name length increases Test function names are limited to 16 characters. This causes the new longer name to be truncated and fail a filecheck test. An outdated comment was also fixed.
This commit is contained in:
@@ -98,7 +98,7 @@ mod test {
|
||||
"
|
||||
test run
|
||||
function %test() -> b8 {
|
||||
ebb0:
|
||||
block0:
|
||||
nop
|
||||
v1 = bconst.b8 true
|
||||
return v1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/// Look for a directive in a comment string.
|
||||
/// The directive is of the form "foo:" and should follow the leading `;` in the comment:
|
||||
///
|
||||
/// ; dominates: ebb3 ebb4
|
||||
/// ; dominates: block3 block4
|
||||
///
|
||||
/// Return the comment text following the directive.
|
||||
pub fn match_directive<'a>(comment: &'a str, directive: &str) -> Option<&'a str> {
|
||||
|
||||
@@ -73,8 +73,8 @@ impl binemit::CodeSink for TextSink {
|
||||
self.offset += 8;
|
||||
}
|
||||
|
||||
fn reloc_ebb(&mut self, reloc: binemit::Reloc, ebb_offset: binemit::CodeOffset) {
|
||||
write!(self.text, "{}({}) ", reloc, ebb_offset).unwrap();
|
||||
fn reloc_block(&mut self, reloc: binemit::Reloc, block_offset: binemit::CodeOffset) {
|
||||
write!(self.text, "{}({}) ", reloc, block_offset).unwrap();
|
||||
}
|
||||
|
||||
fn reloc_external(
|
||||
@@ -151,9 +151,9 @@ impl SubTest for TestBinEmit {
|
||||
|
||||
// Give an encoding to any instruction that doesn't already have one.
|
||||
let mut divert = RegDiversions::new();
|
||||
for ebb in func.layout.ebbs() {
|
||||
for block in func.layout.blocks() {
|
||||
divert.clear();
|
||||
for inst in func.layout.ebb_insts(ebb) {
|
||||
for inst in func.layout.block_insts(block) {
|
||||
if !func.encodings[inst].is_legal() {
|
||||
// Find an encoding that satisfies both immediate field and register
|
||||
// constraints.
|
||||
@@ -181,7 +181,7 @@ impl SubTest for TestBinEmit {
|
||||
}
|
||||
}
|
||||
|
||||
// Relax branches and compute EBB offsets based on the encodings.
|
||||
// Relax branches and compute block offsets based on the encodings.
|
||||
let mut cfg = ControlFlowGraph::with_function(&func);
|
||||
let mut domtree = DominatorTree::with_function(&func, &cfg);
|
||||
let CodeInfo { total_size, .. } =
|
||||
@@ -218,15 +218,15 @@ impl SubTest for TestBinEmit {
|
||||
|
||||
// Now emit all instructions.
|
||||
let mut sink = TextSink::new();
|
||||
for ebb in func.layout.ebbs() {
|
||||
for block in func.layout.blocks() {
|
||||
divert.clear();
|
||||
// Correct header offsets should have been computed by `relax_branches()`.
|
||||
assert_eq!(
|
||||
sink.offset, func.offsets[ebb],
|
||||
sink.offset, func.offsets[block],
|
||||
"Inconsistent {} header offset",
|
||||
ebb
|
||||
block
|
||||
);
|
||||
for (offset, inst, enc_bytes) in func.inst_offsets(ebb, &encinfo) {
|
||||
for (offset, inst, enc_bytes) in func.inst_offsets(block, &encinfo) {
|
||||
assert_eq!(sink.offset, offset);
|
||||
sink.text.clear();
|
||||
let enc = func.encodings[inst];
|
||||
@@ -293,8 +293,8 @@ impl SubTest for TestBinEmit {
|
||||
|
||||
for (jt, jt_data) in func.jump_tables.iter() {
|
||||
let jt_offset = func.jt_offsets[jt];
|
||||
for ebb in jt_data.iter() {
|
||||
let rel_offset: i32 = func.offsets[*ebb] as i32 - jt_offset as i32;
|
||||
for block in jt_data.iter() {
|
||||
let rel_offset: i32 = func.offsets[*block] as i32 - jt_offset as i32;
|
||||
sink.put4(rel_offset as u32)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ impl binemit::CodeSink for SizeSink {
|
||||
self.offset += 8;
|
||||
}
|
||||
|
||||
fn reloc_ebb(&mut self, _reloc: binemit::Reloc, _ebb_offset: binemit::CodeOffset) {}
|
||||
fn reloc_block(&mut self, _reloc: binemit::Reloc, _block_offset: binemit::CodeOffset) {}
|
||||
fn reloc_external(
|
||||
&mut self,
|
||||
_reloc: binemit::Reloc,
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
//! The `test domtree` test command looks for annotations on instructions like this:
|
||||
//!
|
||||
//! ```clif
|
||||
//! jump ebb3 ; dominates: ebb3
|
||||
//! jump block3 ; dominates: block3
|
||||
//! ```
|
||||
//!
|
||||
//! This annotation means that the jump instruction is expected to be the immediate dominator of
|
||||
//! `ebb3`.
|
||||
//! `block3`.
|
||||
//!
|
||||
//! We verify that the dominator tree annotations are complete and correct.
|
||||
//!
|
||||
@@ -58,31 +58,31 @@ impl SubTest for TestDomtree {
|
||||
));
|
||||
}
|
||||
};
|
||||
for src_ebb in tail.split_whitespace() {
|
||||
let ebb = match context.details.map.lookup_str(src_ebb) {
|
||||
Some(AnyEntity::Ebb(ebb)) => ebb,
|
||||
_ => return Err(format!("expected defined EBB, got {}", src_ebb)),
|
||||
for src_block in tail.split_whitespace() {
|
||||
let block = match context.details.map.lookup_str(src_block) {
|
||||
Some(AnyEntity::Block(block)) => block,
|
||||
_ => return Err(format!("expected defined block, got {}", src_block)),
|
||||
};
|
||||
|
||||
// Annotations say that `inst` is the idom of `ebb`.
|
||||
if expected.insert(ebb, inst).is_some() {
|
||||
return Err(format!("multiple dominators for {}", src_ebb));
|
||||
// Annotations say that `inst` is the idom of `block`.
|
||||
if expected.insert(block, inst).is_some() {
|
||||
return Err(format!("multiple dominators for {}", src_block));
|
||||
}
|
||||
|
||||
// Compare to computed domtree.
|
||||
match domtree.idom(ebb) {
|
||||
match domtree.idom(block) {
|
||||
Some(got_inst) if got_inst != inst => {
|
||||
return Err(format!(
|
||||
"mismatching idoms for {}:\n\
|
||||
want: {}, got: {}",
|
||||
src_ebb, inst, got_inst
|
||||
src_block, inst, got_inst
|
||||
));
|
||||
}
|
||||
None => {
|
||||
return Err(format!(
|
||||
"mismatching idoms for {}:\n\
|
||||
want: {}, got: unreachable",
|
||||
src_ebb, inst
|
||||
src_block, inst
|
||||
));
|
||||
}
|
||||
_ => {}
|
||||
@@ -92,18 +92,18 @@ impl SubTest for TestDomtree {
|
||||
}
|
||||
|
||||
// Now we know that everything in `expected` is consistent with `domtree`.
|
||||
// All other EBB's should be either unreachable or the entry block.
|
||||
for ebb in func
|
||||
// All other block's should be either unreachable or the entry block.
|
||||
for block in func
|
||||
.layout
|
||||
.ebbs()
|
||||
.blocks()
|
||||
.skip(1)
|
||||
.filter(|ebb| !expected.contains_key(ebb))
|
||||
.filter(|block| !expected.contains_key(block))
|
||||
{
|
||||
if let Some(got_inst) = domtree.idom(ebb) {
|
||||
if let Some(got_inst) = domtree.idom(block) {
|
||||
return Err(format!(
|
||||
"mismatching idoms for renumbered {}:\n\
|
||||
want: unrechable, got: {}",
|
||||
ebb, got_inst
|
||||
block, got_inst
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -118,8 +118,8 @@ fn filecheck_text(func: &Function, domtree: &DominatorTree) -> Result<String, fm
|
||||
let mut s = String::new();
|
||||
|
||||
write!(s, "cfg_postorder:")?;
|
||||
for &ebb in domtree.cfg_postorder() {
|
||||
write!(s, " {}", ebb)?;
|
||||
for &block in domtree.cfg_postorder() {
|
||||
write!(s, " {}", block)?;
|
||||
}
|
||||
writeln!(s)?;
|
||||
|
||||
@@ -129,10 +129,10 @@ fn filecheck_text(func: &Function, domtree: &DominatorTree) -> Result<String, fm
|
||||
dtpo.compute(domtree, &func.layout);
|
||||
let mut stack = Vec::new();
|
||||
stack.extend(func.layout.entry_block());
|
||||
while let Some(ebb) = stack.pop() {
|
||||
write!(s, " {}:", ebb)?;
|
||||
while let Some(block) = stack.pop() {
|
||||
write!(s, " {}:", block)?;
|
||||
let i = stack.len();
|
||||
for ch in dtpo.children(ebb) {
|
||||
for ch in dtpo.children(block) {
|
||||
write!(s, " {}", ch)?;
|
||||
stack.push(ch);
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ impl binemit::CodeSink for RodataSink {
|
||||
}
|
||||
}
|
||||
|
||||
fn reloc_ebb(&mut self, _reloc: binemit::Reloc, _ebb_offset: binemit::CodeOffset) {}
|
||||
fn reloc_block(&mut self, _reloc: binemit::Reloc, _block_offset: binemit::CodeOffset) {}
|
||||
fn reloc_external(&mut self, _: binemit::Reloc, _: &ir::ExternalName, _: binemit::Addend) {}
|
||||
fn reloc_constant(&mut self, _: binemit::Reloc, _: ir::ConstantOffset) {}
|
||||
fn reloc_jt(&mut self, _reloc: binemit::Reloc, _jt: ir::JumpTable) {}
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
//! The `test verifier` test command looks for annotations on instructions like this:
|
||||
//!
|
||||
//! ```clif
|
||||
//! jump ebb3 ; error: jump to non-existent EBB
|
||||
//! jump block3 ; error: jump to non-existent block
|
||||
//! ```
|
||||
//!
|
||||
//! This annotation means that the verifier is expected to given an error for the jump instruction
|
||||
//! containing the substring "jump to non-existent EBB".
|
||||
//! containing the substring "jump to non-existent block".
|
||||
|
||||
use crate::match_directive::match_directive;
|
||||
use crate::subtest::{Context, SubTest, SubtestResult};
|
||||
|
||||
Reference in New Issue
Block a user