authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-21 23:48:02-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-21 23:48:02-05:00
logd544672ed4cb8d8054665c9491d019dabac454e7
tree1ff618ce371249e963b46b83d7f8dd13ca7d9e16
parentb55efe5fabc5e743406d62bf5b1c2ebfcc8fc5b0

IR: fix compile time evaluation of else prong in switch


1 files changed, 10 insertions(+), 8 deletions(-)

src/ir.cpp+10-8
......@@ -8090,6 +8090,7 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,
80908090 if (!target_val)
80918091 return ir_unreach_error(ira);
80928092
8093 IrBasicBlock *old_dest_block = switch_br_instruction->else_block;
80938094 for (size_t i = 0; i < case_count; i += 1) {
80948095 IrInstructionSwitchBrCase *old_case = &switch_br_instruction->cases[i];
80958096 IrInstruction *case_value = old_case->value->other;
......@@ -8111,17 +8112,18 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,
81118112 return ir_unreach_error(ira);
81128113
81138114 if (const_values_equal(target_val, case_val, target_value->type_entry)) {
8114 IrBasicBlock *old_dest_block = old_case->block;
8115 if (is_comptime || old_dest_block->ref_count == 1) {
8116 return ir_inline_bb(ira, &switch_br_instruction->base, old_dest_block);
8117 } else {
8118 IrBasicBlock *new_dest_block = ir_get_new_bb(ira, old_dest_block);
8119 ir_build_br_from(&ira->new_irb, &switch_br_instruction->base, new_dest_block);
8120 return ir_finish_anal(ira, ira->codegen->builtin_types.entry_unreachable);
8121 }
8115 old_dest_block = old_case->block;
8116 break;
81228117 }
81238118 }
81248119
8120 if (is_comptime || old_dest_block->ref_count == 1) {
8121 return ir_inline_bb(ira, &switch_br_instruction->base, old_dest_block);
8122 } else {
8123 IrBasicBlock *new_dest_block = ir_get_new_bb(ira, old_dest_block);
8124 ir_build_br_from(&ira->new_irb, &switch_br_instruction->base, new_dest_block);
8125 return ir_finish_anal(ira, ira->codegen->builtin_types.entry_unreachable);
8126 }
81258127 }
81268128
81278129 IrInstructionSwitchBrCase *cases = allocate<IrInstructionSwitchBrCase>(case_count);