From f5f3c2fb2547915143c786c2bc4d41a8080017ed Mon Sep 17 00:00:00 2001 From: Will Robson Date: Fri, 2 Apr 2021 15:34:49 +0100 Subject: [PATCH] Add test cases to show the unsealed block in switch generation --- cranelift/frontend/src/switch.rs | 67 ++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/cranelift/frontend/src/switch.rs b/cranelift/frontend/src/switch.rs index f4711e4591..0d27918332 100644 --- a/cranelift/frontend/src/switch.rs +++ b/cranelift/frontend/src/switch.rs @@ -542,38 +542,47 @@ block4: #[test] 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(); - 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::>(); - - 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_(&[]); + for case in cases { + for typ in &[types::I8, types::I16, types::I32, types::I64, types::I128] { + eprintln!("Testing {:?} with keys: {:?}", typ, case); + do_case(case, *typ); + } } - 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::>(); + + 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]