IR: support switch with range

master
Andrew Kelley 2016-11-26 04:03:39 -05:00
parent bbf785bc1d
commit 697c768730
2 changed files with 34 additions and 2 deletions

View File

@ -630,6 +630,7 @@ static IrInstruction *ir_build_phi(IrBuilder *irb, AstNode *source_node,
phi_instruction->incoming_values = incoming_values;
for (size_t i = 0; i < incoming_count; i += 1) {
ir_ref_bb(incoming_blocks[i]);
ir_ref_instruction(incoming_values[i]);
}
@ -2784,8 +2785,8 @@ static void ir_start_bb(IrAnalyze *ira, IrBasicBlock *old_bb, IrBasicBlock *cons
ira->old_irb.current_basic_block = old_bb;
ira->const_predecessor_bb = const_predecessor_bb;
assert(old_bb->other);
ira->new_irb.exec->basic_block_list.append(old_bb->other);
if (old_bb->other)
ira->new_irb.exec->basic_block_list.append(old_bb->other);
}
static void ir_finish_bb(IrAnalyze *ira) {

View File

@ -20,6 +20,35 @@ fn inlinedLoop() {
assert(sum == 15);
}
fn switchWithNumbers() {
testSwitchWithNumbers(13);
}
fn testSwitchWithNumbers(x: u32) {
const result = switch (x) {
1, 2, 3, 4 ... 8 => false,
13 => true,
else => false,
};
assert(result);
}
fn switchWithAllRanges() {
assert(testSwitchWithAllRanges(50, 3) == 1);
assert(testSwitchWithAllRanges(101, 0) == 2);
assert(testSwitchWithAllRanges(300, 5) == 3);
assert(testSwitchWithAllRanges(301, 6) == 6);
}
fn testSwitchWithAllRanges(x: u32, y: u32) -> u32 {
switch (x) {
0 ... 100 => 1,
101 ... 200 => 2,
201 ... 300 => 3,
else => y,
}
}
fn assert(ok: bool) {
if (!ok)
@unreachable();
@ -29,6 +58,8 @@ fn runAllTests() {
emptyFunctionWithComments();
disabledExternFn();
inlinedLoop();
switchWithNumbers();
switchWithAllRanges();
}
export nakedcc fn _start() -> unreachable {