From f0d7438728fd176de0ebf72c4e793334d627e10c Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Mon, 29 Jul 2019 14:11:40 +0200 Subject: [PATCH] Properly legalize with empty jump tables. --- cranelift/codegen/src/legalizer/mod.rs | 9 ++++++--- .../filetests/legalizer/empty_br_table.clif | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 cranelift/filetests/filetests/legalizer/empty_br_table.clif diff --git a/cranelift/codegen/src/legalizer/mod.rs b/cranelift/codegen/src/legalizer/mod.rs index 0905fb05c5..5a87492964 100644 --- a/cranelift/codegen/src/legalizer/mod.rs +++ b/cranelift/codegen/src/legalizer/mod.rs @@ -295,9 +295,12 @@ fn expand_br_table_conds( // This is a poor man's jump table using just a sequence of conditional branches. let table_size = func.jump_tables[table].len(); - let mut cond_failed_ebb = std::vec::Vec::with_capacity(table_size - 1); - for _ in 0..table_size - 1 { - cond_failed_ebb.push(func.dfg.make_ebb()); + let mut cond_failed_ebb = vec![]; + if table_size >= 1 { + cond_failed_ebb = std::vec::Vec::with_capacity(table_size - 1); + for _ in 0..table_size - 1 { + cond_failed_ebb.push(func.dfg.make_ebb()); + } } let mut pos = FuncCursor::new(func).at_inst(inst); diff --git a/cranelift/filetests/filetests/legalizer/empty_br_table.clif b/cranelift/filetests/filetests/legalizer/empty_br_table.clif new file mode 100644 index 0000000000..6dfceb5a6b --- /dev/null +++ b/cranelift/filetests/filetests/legalizer/empty_br_table.clif @@ -0,0 +1,17 @@ +test legalizer +set probestack_enabled=false +set jump_tables_enabled=false +target x86_64 + +function u0:0(i64) { + jt0 = jump_table [] + +ebb0(v0: i64): + br_table v0, ebb1, jt0 +; check: ebb0(v0: i64): +; nextln: jump ebb1 + +ebb1: + return +} +; not: jump_table