Generate basic-blocks instead of Ebb in frontend::switch. (#981)

This commit is contained in:
Nicolas B. Pierron
2019-09-06 22:07:06 +02:00
committed by Sean Stangl
parent e35cf861db
commit 891944dba1

View File

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