authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-03-18 13:37:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-03-18 14:04:02-07:00
loga6f5aa71ac1e8c9a27ecfa6a50f0445a50545a5d
treefe02d07bcf03618bc4769fab9c6090a27b4792a1
parentac7217e1f5ff15a6fc8248b9c1c651b318f472ad

stage1: small IR memory optimization on CheckSwitchProngs


3 files changed, 35 insertions(+), 20 deletions(-)

src/stage1/all_types.hpp+2-2
......@@ -2610,7 +2610,8 @@ enum IrInstSrcId {
26102610 IrInstSrcIdEnumToInt,
26112611 IrInstSrcIdIntToErr,
26122612 IrInstSrcIdErrToInt,
2613 IrInstSrcIdCheckSwitchProngs,
2613 IrInstSrcIdCheckSwitchProngsUnderYes,
2614 IrInstSrcIdCheckSwitchProngsUnderNo,
26142615 IrInstSrcIdCheckStatementIsVoid,
26152616 IrInstSrcIdTypeName,
26162617 IrInstSrcIdDeclRef,
......@@ -4021,7 +4022,6 @@ struct IrInstSrcCheckSwitchProngs {
40214022 IrInstSrcCheckSwitchProngsRange *ranges;
40224023 size_t range_count;
40234024 AstNode* else_prong;
4024 bool have_underscore_prong;
40254025};
40264026
40274027struct IrInstSrcCheckStatementIsVoid {
src/stage1/ir.cpp+19-13
......@@ -476,7 +476,8 @@ static void destroy_instruction_src(IrInstSrc *inst) {
476476 return heap::c_allocator.destroy(reinterpret_cast<IrInstSrcIntToErr *>(inst));
477477 case IrInstSrcIdErrToInt:
478478 return heap::c_allocator.destroy(reinterpret_cast<IrInstSrcErrToInt *>(inst));
479 case IrInstSrcIdCheckSwitchProngs:
479 case IrInstSrcIdCheckSwitchProngsUnderNo:
480 case IrInstSrcIdCheckSwitchProngsUnderYes:
480481 return heap::c_allocator.destroy(reinterpret_cast<IrInstSrcCheckSwitchProngs *>(inst));
481482 case IrInstSrcIdCheckStatementIsVoid:
482483 return heap::c_allocator.destroy(reinterpret_cast<IrInstSrcCheckStatementIsVoid *>(inst));
......@@ -1471,10 +1472,6 @@ static constexpr IrInstSrcId ir_inst_id(IrInstSrcErrToInt *) {
14711472 return IrInstSrcIdErrToInt;
14721473}
14731474
1474static constexpr IrInstSrcId ir_inst_id(IrInstSrcCheckSwitchProngs *) {
1475 return IrInstSrcIdCheckSwitchProngs;
1476}
1477
14781475static constexpr IrInstSrcId ir_inst_id(IrInstSrcCheckStatementIsVoid *) {
14791476 return IrInstSrcIdCheckStatementIsVoid;
14801477}
......@@ -4351,13 +4348,19 @@ static IrInstSrc *ir_build_check_switch_prongs(IrBuilderSrc *irb, Scope *scope,
43514348 IrInstSrc *target_value, IrInstSrcCheckSwitchProngsRange *ranges, size_t range_count,
43524349 AstNode* else_prong, bool have_underscore_prong)
43534350{
4354 IrInstSrcCheckSwitchProngs *instruction = ir_build_instruction<IrInstSrcCheckSwitchProngs>(
4355 irb, scope, source_node);
4351 IrInstSrcCheckSwitchProngs *instruction = heap::c_allocator.create<IrInstSrcCheckSwitchProngs>();
4352 instruction->base.id = have_underscore_prong ?
4353 IrInstSrcIdCheckSwitchProngsUnderYes : IrInstSrcIdCheckSwitchProngsUnderNo;
4354 instruction->base.base.scope = scope;
4355 instruction->base.base.source_node = source_node;
4356 instruction->base.base.debug_id = exec_next_debug_id(irb->exec);
4357 instruction->base.owner_bb = irb->current_basic_block;
4358 ir_instruction_append(irb->current_basic_block, &instruction->base);
4359
43564360 instruction->target_value = target_value;
43574361 instruction->ranges = ranges;
43584362 instruction->range_count = range_count;
43594363 instruction->else_prong = else_prong;
4360 instruction->have_underscore_prong = have_underscore_prong;
43614364
43624365 ir_ref_instruction(target_value, irb->current_basic_block);
43634366 for (size_t i = 0; i < range_count; i += 1) {
......@@ -29706,7 +29709,7 @@ static IrInstGen *ir_analyze_instruction_test_comptime(IrAnalyze *ira, IrInstSrc
2970629709}
2970729710
2970829711static IrInstGen *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,
29709 IrInstSrcCheckSwitchProngs *instruction)
29712 IrInstSrcCheckSwitchProngs *instruction, bool have_underscore_prong)
2971029713{
2971129714 IrInstGen *target_value = instruction->target_value->child;
2971229715 ZigType *switch_type = target_value->value->type;
......@@ -29771,7 +29774,7 @@ static IrInstGen *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,
2977129774 bigint_incr(&field_index);
2977229775 }
2977329776 }
29774 if (instruction->have_underscore_prong) {
29777 if (have_underscore_prong) {
2977529778 if (!switch_type->data.enumeration.non_exhaustive) {
2977629779 ir_add_error(ira, &instruction->base.base,
2977729780 buf_sprintf("switch on exhaustive enum has `_` prong"));
......@@ -32347,8 +32350,10 @@ static IrInstGen *ir_analyze_instruction_base(IrAnalyze *ira, IrInstSrc *instruc
3234732350 return ir_analyze_instruction_fn_proto(ira, (IrInstSrcFnProto *)instruction);
3234832351 case IrInstSrcIdTestComptime:
3234932352 return ir_analyze_instruction_test_comptime(ira, (IrInstSrcTestComptime *)instruction);
32350 case IrInstSrcIdCheckSwitchProngs:
32351 return ir_analyze_instruction_check_switch_prongs(ira, (IrInstSrcCheckSwitchProngs *)instruction);
32353 case IrInstSrcIdCheckSwitchProngsUnderNo:
32354 return ir_analyze_instruction_check_switch_prongs(ira, (IrInstSrcCheckSwitchProngs *)instruction, false);
32355 case IrInstSrcIdCheckSwitchProngsUnderYes:
32356 return ir_analyze_instruction_check_switch_prongs(ira, (IrInstSrcCheckSwitchProngs *)instruction, true);
3235232357 case IrInstSrcIdCheckStatementIsVoid:
3235332358 return ir_analyze_instruction_check_statement_is_void(ira, (IrInstSrcCheckStatementIsVoid *)instruction);
3235432359 case IrInstSrcIdDeclRef:
......@@ -32745,7 +32750,8 @@ bool ir_inst_src_has_side_effects(IrInstSrc *instruction) {
3274532750 case IrInstSrcIdMemcpy:
3274632751 case IrInstSrcIdBreakpoint:
3274732752 case IrInstSrcIdOverflowOp: // TODO when we support multiple returns this can be side effect free
32748 case IrInstSrcIdCheckSwitchProngs:
32753 case IrInstSrcIdCheckSwitchProngsUnderNo:
32754 case IrInstSrcIdCheckSwitchProngsUnderYes:
3274932755 case IrInstSrcIdCheckStatementIsVoid:
3275032756 case IrInstSrcIdCheckRuntimeScope:
3275132757 case IrInstSrcIdPanic:
src/stage1/ir_print.cpp+14-5
......@@ -270,8 +270,10 @@ const char* ir_inst_src_type_str(IrInstSrcId id) {
270270 return "SrcIntToErr";
271271 case IrInstSrcIdErrToInt:
272272 return "SrcErrToInt";
273 case IrInstSrcIdCheckSwitchProngs:
274 return "SrcCheckSwitchProngs";
273 case IrInstSrcIdCheckSwitchProngsUnderNo:
274 return "SrcCheckSwitchProngsUnderNo";
275 case IrInstSrcIdCheckSwitchProngsUnderYes:
276 return "SrcCheckSwitchProngsUnderYes";
275277 case IrInstSrcIdCheckStatementIsVoid:
276278 return "SrcCheckStatementIsVoid";
277279 case IrInstSrcIdTypeName:
......@@ -2189,7 +2191,9 @@ static void ir_print_err_to_int(IrPrintGen *irp, IrInstGenErrToInt *instruction)
21892191 ir_print_other_inst_gen(irp, instruction->target);
21902192}
21912193
2192static void ir_print_check_switch_prongs(IrPrintSrc *irp, IrInstSrcCheckSwitchProngs *instruction) {
2194static void ir_print_check_switch_prongs(IrPrintSrc *irp, IrInstSrcCheckSwitchProngs *instruction,
2195 bool have_underscore_prong)
2196{
21932197 fprintf(irp->f, "@checkSwitchProngs(");
21942198 ir_print_other_inst_src(irp, instruction->target_value);
21952199 fprintf(irp->f, ",");
......@@ -2202,6 +2206,8 @@ static void ir_print_check_switch_prongs(IrPrintSrc *irp, IrInstSrcCheckSwitchPr
22022206 }
22032207 const char *have_else_str = instruction->else_prong != nullptr ? "yes" : "no";
22042208 fprintf(irp->f, ")else:%s", have_else_str);
2209 const char *have_under_str = have_underscore_prong ? "yes" : "no";
2210 fprintf(irp->f, " _:%s", have_under_str);
22052211}
22062212
22072213static void ir_print_check_statement_is_void(IrPrintSrc *irp, IrInstSrcCheckStatementIsVoid *instruction) {
......@@ -2893,8 +2899,11 @@ static void ir_print_inst_src(IrPrintSrc *irp, IrInstSrc *instruction, bool trai
28932899 case IrInstSrcIdErrToInt:
28942900 ir_print_err_to_int(irp, (IrInstSrcErrToInt *)instruction);
28952901 break;
2896 case IrInstSrcIdCheckSwitchProngs:
2897 ir_print_check_switch_prongs(irp, (IrInstSrcCheckSwitchProngs *)instruction);
2902 case IrInstSrcIdCheckSwitchProngsUnderNo:
2903 ir_print_check_switch_prongs(irp, (IrInstSrcCheckSwitchProngs *)instruction, false);
2904 break;
2905 case IrInstSrcIdCheckSwitchProngsUnderYes:
2906 ir_print_check_switch_prongs(irp, (IrInstSrcCheckSwitchProngs *)instruction, true);
28982907 break;
28992908 case IrInstSrcIdCheckStatementIsVoid:
29002909 ir_print_check_statement_is_void(irp, (IrInstSrcCheckStatementIsVoid *)instruction);