authorgravatar for r00ster91@proton.meWooster <r00ster91@proton.me> 2023-03-03 17:30:18+01:00
committergravatar for r00ster91@proton.meWooster <r00ster91@proton.me> 2023-03-03 21:16:21+01:00
logd6bd00e85500fa1a7909695ae5943be438f7521d
tree55999396212ade2f2494b585ceeb7af3e64ab13d
parent75ff34db9e93056482233f8476a06f78b4a2f3c2

Zir: move set_cold from Inst.Tag to Inst.Extended

If I could mark a builtin function as cold, I would mark @setCold as cold. We have run out of `Zir.Inst.Tag`s so I had to move a tag from Zir.Inst.Tag to Zir.Inst.Extended. This is because a new noreturn builtin will be added and noreturn builtins cannot be part of Inst.Tag: ``` /// `noreturn` instructions may not go here; they must be part of the main `Tag` enum. pub const Extended = enum(u16) { ``` Here's another reason I went for @setCold: ``` $ git grep setRuntimeSafety | wc -l 322 $ git grep setCold | wc -l 79 $ git grep setEvalBranchQuota | wc -l 82 ``` This also simply removes @setCold from Autodoc and the docs frontend because as far as I could understand it, builtins represented using Zir extended instructions are not yet supported because I couldn't find @setStackAlign or @setFloatMode there, either.

6 files changed, 24 insertions(+), 24 deletions(-)

lib/docs/main.js-4
......@@ -1187,10 +1187,6 @@ const NAV_MODES = {
11871187 payloadHtml += "panic";
11881188 break;
11891189 }
1190 case "set_cold": {
1191 payloadHtml += "setCold";
1192 break;
1193 }
11941190 case "set_runtime_safety": {
11951191 payloadHtml += "setRuntimeSafety";
11961192 break;
src/AstGen.zig+10-3
......@@ -2609,8 +2609,9 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
26092609 .extended => switch (gz.astgen.instructions.items(.data)[inst].extended.opcode) {
26102610 .breakpoint,
26112611 .fence,
2612 .set_align_stack,
26132612 .set_float_mode,
2613 .set_align_stack,
2614 .set_cold,
26142615 => break :b true,
26152616 else => break :b false,
26162617 },
......@@ -2658,7 +2659,6 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
26582659 .validate_struct_init_comptime,
26592660 .validate_array_init,
26602661 .validate_array_init_comptime,
2661 .set_cold,
26622662 .set_runtime_safety,
26632663 .closure_capture,
26642664 .memcpy,
......@@ -8078,6 +8078,14 @@ fn builtinCall(
80788078 });
80798079 return rvalue(gz, ri, result, node);
80808080 },
8081 .set_cold => {
8082 const order = try expr(gz, scope, ri, params[0]);
8083 const result = try gz.addExtendedPayload(.set_cold, Zir.Inst.UnNode{
8084 .node = gz.nodeIndexToRelative(node),
8085 .operand = order,
8086 });
8087 return rvalue(gz, ri, result, node);
8088 },
80818089
80828090 .src => {
80838091 const token_starts = tree.tokens.items(.start);
......@@ -8111,7 +8119,6 @@ fn builtinCall(
81118119 .bool_to_int => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .bool_to_int),
81128120 .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .const_slice_u8_type } }, params[0], .embed_file),
81138121 .error_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .anyerror_type } }, params[0], .error_name),
8114 .set_cold => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .set_cold),
81158122 .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .set_runtime_safety),
81168123 .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt),
81178124 .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin),
src/Autodoc.zig-1
......@@ -1338,7 +1338,6 @@ fn walkInstruction(
13381338 .embed_file,
13391339 .error_name,
13401340 .panic,
1341 .set_cold, // @check
13421341 .set_runtime_safety, // @check
13431342 .sqrt,
13441343 .sin,
src/Sema.zig+9-9
......@@ -1167,6 +1167,11 @@ fn analyzeBodyInner(
11671167 i += 1;
11681168 continue;
11691169 },
1170 .set_cold => {
1171 try sema.zirSetCold(block, extended);
1172 i += 1;
1173 continue;
1174 },
11701175 .breakpoint => {
11711176 if (!block.is_comptime) {
11721177 _ = try block.addNoOp(.breakpoint);
......@@ -1304,11 +1309,6 @@ fn analyzeBodyInner(
13041309 i += 1;
13051310 continue;
13061311 },
1307 .set_cold => {
1308 try sema.zirSetCold(block, inst);
1309 i += 1;
1310 continue;
1311 },
13121312 .set_runtime_safety => {
13131313 try sema.zirSetRuntimeSafety(block, inst);
13141314 i += 1;
......@@ -5721,10 +5721,10 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
57215721 gop.value_ptr.* = .{ .alignment = alignment, .src = src };
57225722}
57235723
5724fn zirSetCold(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void {
5725 const inst_data = sema.code.instructions.items(.data)[inst].un_node;
5726 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
5727 const is_cold = try sema.resolveConstBool(block, operand_src, inst_data.operand, "operand to @setCold must be comptime-known");
5724fn zirSetCold(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!void {
5725 const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data;
5726 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node };
5727 const is_cold = try sema.resolveConstBool(block, operand_src, extra.operand, "operand to @setCold must be comptime-known");
57285728 const func = sema.func orelse return; // does nothing outside a function
57295729 func.is_cold = is_cold;
57305730}
src/Zir.zig+4-6
......@@ -808,8 +808,6 @@ pub const Inst = struct {
808808 panic,
809809 /// Same as `panic` but forces comptime.
810810 panic_comptime,
811 /// Implement builtin `@setCold`. Uses `un_node`.
812 set_cold,
813811 /// Implement builtin `@setRuntimeSafety`. Uses `un_node`.
814812 set_runtime_safety,
815813 /// Implement builtin `@sqrt`. Uses `un_node`.
......@@ -1187,7 +1185,6 @@ pub const Inst = struct {
11871185 .bool_to_int,
11881186 .embed_file,
11891187 .error_name,
1190 .set_cold,
11911188 .set_runtime_safety,
11921189 .sqrt,
11931190 .sin,
......@@ -1323,7 +1320,6 @@ pub const Inst = struct {
13231320 .validate_deref,
13241321 .@"export",
13251322 .export_value,
1326 .set_cold,
13271323 .set_runtime_safety,
13281324 .memcpy,
13291325 .memset,
......@@ -1561,7 +1557,7 @@ pub const Inst = struct {
15611557 => false,
15621558
15631559 .extended => switch (data.extended.opcode) {
1564 .breakpoint, .fence => true,
1560 .fence, .set_cold, .breakpoint => true,
15651561 else => false,
15661562 },
15671563 };
......@@ -1750,7 +1746,6 @@ pub const Inst = struct {
17501746 .error_name = .un_node,
17511747 .panic = .un_node,
17521748 .panic_comptime = .un_node,
1753 .set_cold = .un_node,
17541749 .set_runtime_safety = .un_node,
17551750 .sqrt = .un_node,
17561751 .sin = .un_node,
......@@ -1979,6 +1974,9 @@ pub const Inst = struct {
19791974 /// Implement builtin `@setAlignStack`.
19801975 /// `operand` is payload index to `UnNode`.
19811976 set_align_stack,
1977 /// Implements `@setCold`.
1978 /// `operand` is payload index to `UnNode`.
1979 set_cold,
19821980 /// Implements the `@errSetCast` builtin.
19831981 /// `operand` is payload index to `BinNode`. `lhs` is dest type, `rhs` is operand.
19841982 err_set_cast,
src/print_zir.zig+1-1
......@@ -196,7 +196,6 @@ const Writer = struct {
196196 .error_name,
197197 .panic,
198198 .panic_comptime,
199 .set_cold,
200199 .set_runtime_safety,
201200 .sqrt,
202201 .sin,
......@@ -503,6 +502,7 @@ const Writer = struct {
503502 .fence,
504503 .set_float_mode,
505504 .set_align_stack,
505 .set_cold,
506506 .wasm_memory_size,
507507 .error_to_int,
508508 .int_to_error,