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>,
|
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"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user