authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-02-26 15:11:38+00:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-02-29 23:38:17+00:00
logf0a4bb6bd15b8a605e450af3359fe1622302463a
treeb24a50cc98682f16487b0e2e43abdd1f82ef7459
parent147beec7da5f3eb3a858037b806ad8b1b66bfffc
signaturelock-open Commit is signed but in an unrecognized format.

AstGen: avoid unnecessary coercion instructions

Coercions such as `@as(usize, 0)` can be trivially elided by matching these cases and translating to fixed InternPool indices.

1 files changed, 20 insertions(+), 2 deletions(-)

lib/std/zig/AstGen.zig+20-2
...@@ -10874,6 +10874,7 @@ fn rvalueInner(...@@ -10874,6 +10874,7 @@ fn rvalueInner(
10874 const as_comptime_int = @as(u64, @intFromEnum(Zir.Inst.Ref.comptime_int_type)) << 32;10874 const as_comptime_int = @as(u64, @intFromEnum(Zir.Inst.Ref.comptime_int_type)) << 32;
10875 const as_bool = @as(u64, @intFromEnum(Zir.Inst.Ref.bool_type)) << 32;10875 const as_bool = @as(u64, @intFromEnum(Zir.Inst.Ref.bool_type)) << 32;
10876 const as_usize = @as(u64, @intFromEnum(Zir.Inst.Ref.usize_type)) << 32;10876 const as_usize = @as(u64, @intFromEnum(Zir.Inst.Ref.usize_type)) << 32;
10877 const as_u8 = @as(u64, @intFromEnum(Zir.Inst.Ref.u8_type)) << 32;
10877 const as_void = @as(u64, @intFromEnum(Zir.Inst.Ref.void_type)) << 32;10878 const as_void = @as(u64, @intFromEnum(Zir.Inst.Ref.void_type)) << 32;
10878 switch ((@as(u64, @intFromEnum(ty_inst)) << 32) | @as(u64, @intFromEnum(result))) {10879 switch ((@as(u64, @intFromEnum(ty_inst)) << 32) | @as(u64, @intFromEnum(result))) {
10879 as_ty | @intFromEnum(Zir.Inst.Ref.u1_type),10880 as_ty | @intFromEnum(Zir.Inst.Ref.u1_type),
...@@ -10939,13 +10940,30 @@ fn rvalueInner(...@@ -10939,13 +10940,30 @@ fn rvalueInner(
10939 as_ty | @intFromEnum(Zir.Inst.Ref.empty_struct_type),10940 as_ty | @intFromEnum(Zir.Inst.Ref.empty_struct_type),
10940 as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero),10941 as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero),
10941 as_comptime_int | @intFromEnum(Zir.Inst.Ref.one),10942 as_comptime_int | @intFromEnum(Zir.Inst.Ref.one),
10942 as_bool | @intFromEnum(Zir.Inst.Ref.bool_true),10943 as_comptime_int | @intFromEnum(Zir.Inst.Ref.negative_one),
10943 as_bool | @intFromEnum(Zir.Inst.Ref.bool_false),
10944 as_usize | @intFromEnum(Zir.Inst.Ref.zero_usize),10944 as_usize | @intFromEnum(Zir.Inst.Ref.zero_usize),
10945 as_usize | @intFromEnum(Zir.Inst.Ref.one_usize),10945 as_usize | @intFromEnum(Zir.Inst.Ref.one_usize),
10946 as_u8 | @intFromEnum(Zir.Inst.Ref.zero_u8),
10947 as_u8 | @intFromEnum(Zir.Inst.Ref.one_u8),
10948 as_u8 | @intFromEnum(Zir.Inst.Ref.four_u8),
10949 as_bool | @intFromEnum(Zir.Inst.Ref.bool_true),
10950 as_bool | @intFromEnum(Zir.Inst.Ref.bool_false),
10946 as_void | @intFromEnum(Zir.Inst.Ref.void_value),10951 as_void | @intFromEnum(Zir.Inst.Ref.void_value),
10947 => return result, // type of result is already correct10952 => return result, // type of result is already correct
1094810953
10954 as_usize | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_usize,
10955 as_u8 | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_u8,
10956 as_usize | @intFromEnum(Zir.Inst.Ref.one) => return .one_usize,
10957 as_u8 | @intFromEnum(Zir.Inst.Ref.one) => return .one_u8,
10958 as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero,
10959 as_u8 | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero_u8,
10960 as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one,
10961 as_u8 | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one_u8,
10962 as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero,
10963 as_usize | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero_usize,
10964 as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one,
10965 as_usize | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one_usize,
10966
10949 // Need an explicit type coercion instruction.10967 // Need an explicit type coercion instruction.
10950 else => return gz.addPlNode(ri.zirTag(), src_node, Zir.Inst.As{10968 else => return gz.addPlNode(ri.zirTag(), src_node, Zir.Inst.As{
10951 .dest_type = ty_inst,10969 .dest_type = ty_inst,