Generate basic-blocks instead of Ebb in frontend::switch. (#981)
This commit is contained in:
committed by
Sean Stangl
parent
e35cf861db
commit
891944dba1
@@ -167,12 +167,22 @@ impl Switch {
|
||||
contiguous_case_ranges: Vec<ContiguousCaseRange>,
|
||||
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() {
|
||||
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"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user