diff --git a/cranelift/frontend/src/switch.rs b/cranelift/frontend/src/switch.rs index 0db3ac348e..0b1ca746cb 100644 --- a/cranelift/frontend/src/switch.rs +++ b/cranelift/frontend/src/switch.rs @@ -167,12 +167,22 @@ impl Switch { contiguous_case_ranges: Vec, cases_and_jt_ebbs: &mut Vec<(EntryIndex, Ebb, Vec)>, ) { + let mut was_branch = false; + let ins_fallthrough_jump = |was_branch: bool, bx: &mut FunctionBuilder| { + if was_branch { + let ebb = bx.create_ebb(); + bx.ins().jump(ebb, &[]); + bx.switch_to_block(ebb); + } + }; for ContiguousCaseRange { first_index, ebbs } in contiguous_case_ranges.into_iter().rev() { match (ebbs.len(), first_index) { (1, 0) => { + ins_fallthrough_jump(was_branch, bx); bx.ins().brz(val, ebbs[0], &[]); } (1, _) => { + ins_fallthrough_jump(was_branch, bx); let is_good_val = bx.ins().icmp_imm(IntCC::Equal, val, first_index as i64); bx.ins().brnz(is_good_val, ebbs[0], &[]); } @@ -187,6 +197,7 @@ impl Switch { return; } (_, _) => { + ins_fallthrough_jump(was_branch, bx); let jt_ebb = bx.create_ebb(); let is_good_val = bx.ins().icmp_imm( IntCC::UnsignedGreaterThanOrEqual, @@ -197,6 +208,7 @@ impl Switch { cases_and_jt_ebbs.push((first_index, jt_ebb, ebbs)); } } + was_branch = true; } bx.ins().jump(otherwise, &[]); @@ -359,7 +371,10 @@ ebb3: v1 = uextend.i32 v0 v2 = icmp_imm eq v1, 2 brnz v2, ebb2 - brz v1, ebb1 + jump ebb3 + +ebb3: + brz.i32 v1, ebb1 jump ebb0" ); } @@ -382,6 +397,9 @@ ebb0: ebb9: v3 = icmp_imm.i32 uge v1, 10 brnz v3, ebb10 + jump ebb11 + +ebb11: v4 = icmp_imm.i32 eq v1, 7 brnz v4, ebb4 jump ebb0 @@ -389,9 +407,9 @@ ebb9: ebb8: v5 = icmp_imm.i32 eq v1, 5 brnz v5, ebb3 - jump ebb11 + jump ebb12 -ebb11: +ebb12: br_table.i32 v1, ebb0, jt0 ebb10: @@ -410,7 +428,10 @@ ebb10: v1 = uextend.i32 v0 v2 = icmp_imm eq v1, 0x8000_0000_0000_0000 brnz v2, ebb1 - v3 = icmp_imm eq v1, 1 + jump ebb3 + +ebb3: + v3 = icmp_imm.i32 eq v1, 1 brnz v3, ebb2 jump ebb0" ); @@ -426,7 +447,10 @@ ebb10: v1 = uextend.i32 v0 v2 = icmp_imm eq v1, 0x7fff_ffff_ffff_ffff brnz v2, ebb1 - v3 = icmp_imm eq v1, 1 + jump ebb3 + +ebb3: + v3 = icmp_imm.i32 eq v1, 1 brnz v3, ebb2 jump ebb0" )