Add test cases to show the unsealed block in switch generation
This commit is contained in:
@@ -542,38 +542,47 @@ block4:
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn switch_seal_generated_blocks() {
|
fn switch_seal_generated_blocks() {
|
||||||
let keys = [0, 1, 2, 10, 11, 12, 20, 30, 40, 50];
|
let cases = &[vec![0, 1, 2], vec![0, 1, 2, 10, 11, 12, 20, 30, 40, 50]];
|
||||||
|
|
||||||
let mut func = Function::new();
|
for case in cases {
|
||||||
let mut builder_ctx = FunctionBuilderContext::new();
|
for typ in &[types::I8, types::I16, types::I32, types::I64, types::I128] {
|
||||||
let mut builder = FunctionBuilder::new(&mut func, &mut builder_ctx);
|
eprintln!("Testing {:?} with keys: {:?}", typ, case);
|
||||||
|
do_case(case, *typ);
|
||||||
let root_block = builder.create_block();
|
}
|
||||||
let default_block = builder.create_block();
|
|
||||||
let mut switch = Switch::new();
|
|
||||||
|
|
||||||
let case_blocks = keys
|
|
||||||
.iter()
|
|
||||||
.map(|key| {
|
|
||||||
let block = builder.create_block();
|
|
||||||
switch.set_entry(*key, block);
|
|
||||||
block
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
builder.seal_block(root_block);
|
|
||||||
builder.switch_to_block(root_block);
|
|
||||||
|
|
||||||
let val = builder.ins().iconst(types::I32, 1);
|
|
||||||
switch.emit(&mut builder, val, default_block);
|
|
||||||
|
|
||||||
for &block in case_blocks.iter().chain(std::iter::once(&default_block)) {
|
|
||||||
builder.seal_block(block);
|
|
||||||
builder.switch_to_block(block);
|
|
||||||
builder.ins().return_(&[]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.finalize(); // Will panic if some blocks are not sealed
|
fn do_case(keys: &[u128], typ: Type) {
|
||||||
|
let mut func = Function::new();
|
||||||
|
let mut builder_ctx = FunctionBuilderContext::new();
|
||||||
|
let mut builder = FunctionBuilder::new(&mut func, &mut builder_ctx);
|
||||||
|
|
||||||
|
let root_block = builder.create_block();
|
||||||
|
let default_block = builder.create_block();
|
||||||
|
let mut switch = Switch::new();
|
||||||
|
|
||||||
|
let case_blocks = keys
|
||||||
|
.iter()
|
||||||
|
.map(|key| {
|
||||||
|
let block = builder.create_block();
|
||||||
|
switch.set_entry(*key, block);
|
||||||
|
block
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
builder.seal_block(root_block);
|
||||||
|
builder.switch_to_block(root_block);
|
||||||
|
|
||||||
|
let val = builder.ins().iconst(typ, 1);
|
||||||
|
switch.emit(&mut builder, val, default_block);
|
||||||
|
|
||||||
|
for &block in case_blocks.iter().chain(std::iter::once(&default_block)) {
|
||||||
|
builder.seal_block(block);
|
||||||
|
builder.switch_to_block(block);
|
||||||
|
builder.ins().return_(&[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.finalize(); // Will panic if some blocks are not sealed
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user