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 = {...@@ -1187,10 +1187,6 @@ const NAV_MODES = {
1187 payloadHtml += "panic";1187 payloadHtml += "panic";
1188 break;1188 break;
1189 }1189 }
1190 case "set_cold": {
1191 payloadHtml += "setCold";
1192 break;
1193 }
1194 case "set_runtime_safety": {1190 case "set_runtime_safety": {
1195 payloadHtml += "setRuntimeSafety";1191 payloadHtml += "setRuntimeSafety";
1196 break;1192 break;
src/AstGen.zig+10-3
...@@ -2609,8 +2609,9 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As...@@ -2609,8 +2609,9 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
2609 .extended => switch (gz.astgen.instructions.items(.data)[inst].extended.opcode) {2609 .extended => switch (gz.astgen.instructions.items(.data)[inst].extended.opcode) {
2610 .breakpoint,2610 .breakpoint,
2611 .fence,2611 .fence,
2612 .set_align_stack,
2613 .set_float_mode,2612 .set_float_mode,
2613 .set_align_stack,
2614 .set_cold,
2614 => break :b true,2615 => break :b true,
2615 else => break :b false,2616 else => break :b false,
2616 },2617 },
...@@ -2658,7 +2659,6 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As...@@ -2658,7 +2659,6 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
2658 .validate_struct_init_comptime,2659 .validate_struct_init_comptime,
2659 .validate_array_init,2660 .validate_array_init,
2660 .validate_array_init_comptime,2661 .validate_array_init_comptime,
2661 .set_cold,
2662 .set_runtime_safety,2662 .set_runtime_safety,
2663 .closure_capture,2663 .closure_capture,
2664 .memcpy,2664 .memcpy,
...@@ -8078,6 +8078,14 @@ fn builtinCall(...@@ -8078,6 +8078,14 @@ fn builtinCall(
8078 });8078 });
8079 return rvalue(gz, ri, result, node);8079 return rvalue(gz, ri, result, node);
8080 },8080 },
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
8082 .src => {8090 .src => {
8083 const token_starts = tree.tokens.items(.start);8091 const token_starts = tree.tokens.items(.start);
...@@ -8111,7 +8119,6 @@ fn builtinCall(...@@ -8111,7 +8119,6 @@ fn builtinCall(
8111 .bool_to_int => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .bool_to_int),8119 .bool_to_int => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .bool_to_int),
8112 .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .const_slice_u8_type } }, params[0], .embed_file),8120 .embed_file => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .const_slice_u8_type } }, params[0], .embed_file),
8113 .error_name => return simpleUnOp(gz, scope, ri, node, .{ .rl = .{ .ty = .anyerror_type } }, params[0], .error_name),8121 .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),
8115 .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .set_runtime_safety),8122 .set_runtime_safety => return simpleUnOp(gz, scope, ri, node, bool_ri, params[0], .set_runtime_safety),
8116 .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt),8123 .sqrt => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sqrt),
8117 .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin),8124 .sin => return simpleUnOp(gz, scope, ri, node, .{ .rl = .none }, params[0], .sin),
src/Autodoc.zig-1
...@@ -1338,7 +1338,6 @@ fn walkInstruction(...@@ -1338,7 +1338,6 @@ fn walkInstruction(
1338 .embed_file,1338 .embed_file,
1339 .error_name,1339 .error_name,
1340 .panic,1340 .panic,
1341 .set_cold, // @check
1342 .set_runtime_safety, // @check1341 .set_runtime_safety, // @check
1343 .sqrt,1342 .sqrt,
1344 .sin,1343 .sin,
src/Sema.zig+9-9
...@@ -1167,6 +1167,11 @@ fn analyzeBodyInner(...@@ -1167,6 +1167,11 @@ fn analyzeBodyInner(
1167 i += 1;1167 i += 1;
1168 continue;1168 continue;
1169 },1169 },
1170 .set_cold => {
1171 try sema.zirSetCold(block, extended);
1172 i += 1;
1173 continue;
1174 },
1170 .breakpoint => {1175 .breakpoint => {
1171 if (!block.is_comptime) {1176 if (!block.is_comptime) {
1172 _ = try block.addNoOp(.breakpoint);1177 _ = try block.addNoOp(.breakpoint);
...@@ -1304,11 +1309,6 @@ fn analyzeBodyInner(...@@ -1304,11 +1309,6 @@ fn analyzeBodyInner(
1304 i += 1;1309 i += 1;
1305 continue;1310 continue;
1306 },1311 },
1307 .set_cold => {
1308 try sema.zirSetCold(block, inst);
1309 i += 1;
1310 continue;
1311 },
1312 .set_runtime_safety => {1312 .set_runtime_safety => {
1313 try sema.zirSetRuntimeSafety(block, inst);1313 try sema.zirSetRuntimeSafety(block, inst);
1314 i += 1;1314 i += 1;
...@@ -5721,10 +5721,10 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst...@@ -5721,10 +5721,10 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
5721 gop.value_ptr.* = .{ .alignment = alignment, .src = src };5721 gop.value_ptr.* = .{ .alignment = alignment, .src = src };
5722}5722}
57235723
5724fn zirSetCold(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void {5724fn zirSetCold(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!void {
5725 const inst_data = sema.code.instructions.items(.data)[inst].un_node;5725 const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data;
5726 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };5726 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node };
5727 const is_cold = try sema.resolveConstBool(block, operand_src, inst_data.operand, "operand to @setCold must be comptime-known");5727 const is_cold = try sema.resolveConstBool(block, operand_src, extra.operand, "operand to @setCold must be comptime-known");
5728 const func = sema.func orelse return; // does nothing outside a function5728 const func = sema.func orelse return; // does nothing outside a function
5729 func.is_cold = is_cold;5729 func.is_cold = is_cold;
5730}5730}
src/Zir.zig+4-6
...@@ -808,8 +808,6 @@ pub const Inst = struct {...@@ -808,8 +808,6 @@ pub const Inst = struct {
808 panic,808 panic,
809 /// Same as `panic` but forces comptime.809 /// Same as `panic` but forces comptime.
810 panic_comptime,810 panic_comptime,
811 /// Implement builtin `@setCold`. Uses `un_node`.
812 set_cold,
813 /// Implement builtin `@setRuntimeSafety`. Uses `un_node`.811 /// Implement builtin `@setRuntimeSafety`. Uses `un_node`.
814 set_runtime_safety,812 set_runtime_safety,
815 /// Implement builtin `@sqrt`. Uses `un_node`.813 /// Implement builtin `@sqrt`. Uses `un_node`.
...@@ -1187,7 +1185,6 @@ pub const Inst = struct {...@@ -1187,7 +1185,6 @@ pub const Inst = struct {
1187 .bool_to_int,1185 .bool_to_int,
1188 .embed_file,1186 .embed_file,
1189 .error_name,1187 .error_name,
1190 .set_cold,
1191 .set_runtime_safety,1188 .set_runtime_safety,
1192 .sqrt,1189 .sqrt,
1193 .sin,1190 .sin,
...@@ -1323,7 +1320,6 @@ pub const Inst = struct {...@@ -1323,7 +1320,6 @@ pub const Inst = struct {
1323 .validate_deref,1320 .validate_deref,
1324 .@"export",1321 .@"export",
1325 .export_value,1322 .export_value,
1326 .set_cold,
1327 .set_runtime_safety,1323 .set_runtime_safety,
1328 .memcpy,1324 .memcpy,
1329 .memset,1325 .memset,
...@@ -1561,7 +1557,7 @@ pub const Inst = struct {...@@ -1561,7 +1557,7 @@ pub const Inst = struct {
1561 => false,1557 => false,
15621558
1563 .extended => switch (data.extended.opcode) {1559 .extended => switch (data.extended.opcode) {
1564 .breakpoint, .fence => true,1560 .fence, .set_cold, .breakpoint => true,
1565 else => false,1561 else => false,
1566 },1562 },
1567 };1563 };
...@@ -1750,7 +1746,6 @@ pub const Inst = struct {...@@ -1750,7 +1746,6 @@ pub const Inst = struct {
1750 .error_name = .un_node,1746 .error_name = .un_node,
1751 .panic = .un_node,1747 .panic = .un_node,
1752 .panic_comptime = .un_node,1748 .panic_comptime = .un_node,
1753 .set_cold = .un_node,
1754 .set_runtime_safety = .un_node,1749 .set_runtime_safety = .un_node,
1755 .sqrt = .un_node,1750 .sqrt = .un_node,
1756 .sin = .un_node,1751 .sin = .un_node,
...@@ -1979,6 +1974,9 @@ pub const Inst = struct {...@@ -1979,6 +1974,9 @@ pub const Inst = struct {
1979 /// Implement builtin `@setAlignStack`.1974 /// Implement builtin `@setAlignStack`.
1980 /// `operand` is payload index to `UnNode`.1975 /// `operand` is payload index to `UnNode`.
1981 set_align_stack,1976 set_align_stack,
1977 /// Implements `@setCold`.
1978 /// `operand` is payload index to `UnNode`.
1979 set_cold,
1982 /// Implements the `@errSetCast` builtin.1980 /// Implements the `@errSetCast` builtin.
1983 /// `operand` is payload index to `BinNode`. `lhs` is dest type, `rhs` is operand.1981 /// `operand` is payload index to `BinNode`. `lhs` is dest type, `rhs` is operand.
1984 err_set_cast,1982 err_set_cast,
src/print_zir.zig+1-1
...@@ -196,7 +196,6 @@ const Writer = struct {...@@ -196,7 +196,6 @@ const Writer = struct {
196 .error_name,196 .error_name,
197 .panic,197 .panic,
198 .panic_comptime,198 .panic_comptime,
199 .set_cold,
200 .set_runtime_safety,199 .set_runtime_safety,
201 .sqrt,200 .sqrt,
202 .sin,201 .sin,
...@@ -503,6 +502,7 @@ const Writer = struct {...@@ -503,6 +502,7 @@ const Writer = struct {
503 .fence,502 .fence,
504 .set_float_mode,503 .set_float_mode,
505 .set_align_stack,504 .set_align_stack,
505 .set_cold,
506 .wasm_memory_size,506 .wasm_memory_size,
507 .error_to_int,507 .error_to_int,
508 .int_to_error,508 .int_to_error,