From f0a4bb6bd15b8a605e450af3359fe1622302463a Mon Sep 17 00:00:00 2001 From: mlugg Date: Mon, 26 Feb 2024 15:11:38 +0000 Subject: [PATCH] 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. --- lib/std/zig/AstGen.zig | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 20b1077420..c7399b63bd 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -10874,6 +10874,7 @@ fn rvalueInner( const as_comptime_int = @as(u64, @intFromEnum(Zir.Inst.Ref.comptime_int_type)) << 32; const as_bool = @as(u64, @intFromEnum(Zir.Inst.Ref.bool_type)) << 32; const as_usize = @as(u64, @intFromEnum(Zir.Inst.Ref.usize_type)) << 32; + const as_u8 = @as(u64, @intFromEnum(Zir.Inst.Ref.u8_type)) << 32; const as_void = @as(u64, @intFromEnum(Zir.Inst.Ref.void_type)) << 32; switch ((@as(u64, @intFromEnum(ty_inst)) << 32) | @as(u64, @intFromEnum(result))) { as_ty | @intFromEnum(Zir.Inst.Ref.u1_type), @@ -10939,13 +10940,30 @@ fn rvalueInner( as_ty | @intFromEnum(Zir.Inst.Ref.empty_struct_type), as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero), as_comptime_int | @intFromEnum(Zir.Inst.Ref.one), - as_bool | @intFromEnum(Zir.Inst.Ref.bool_true), - as_bool | @intFromEnum(Zir.Inst.Ref.bool_false), + as_comptime_int | @intFromEnum(Zir.Inst.Ref.negative_one), as_usize | @intFromEnum(Zir.Inst.Ref.zero_usize), as_usize | @intFromEnum(Zir.Inst.Ref.one_usize), + as_u8 | @intFromEnum(Zir.Inst.Ref.zero_u8), + as_u8 | @intFromEnum(Zir.Inst.Ref.one_u8), + as_u8 | @intFromEnum(Zir.Inst.Ref.four_u8), + as_bool | @intFromEnum(Zir.Inst.Ref.bool_true), + as_bool | @intFromEnum(Zir.Inst.Ref.bool_false), as_void | @intFromEnum(Zir.Inst.Ref.void_value), => return result, // type of result is already correct + as_usize | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_usize, + as_u8 | @intFromEnum(Zir.Inst.Ref.zero) => return .zero_u8, + as_usize | @intFromEnum(Zir.Inst.Ref.one) => return .one_usize, + as_u8 | @intFromEnum(Zir.Inst.Ref.one) => return .one_u8, + as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero, + as_u8 | @intFromEnum(Zir.Inst.Ref.zero_usize) => return .zero_u8, + as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one, + as_u8 | @intFromEnum(Zir.Inst.Ref.one_usize) => return .one_u8, + as_comptime_int | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero, + as_usize | @intFromEnum(Zir.Inst.Ref.zero_u8) => return .zero_usize, + as_comptime_int | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one, + as_usize | @intFromEnum(Zir.Inst.Ref.one_u8) => return .one_usize, + // Need an explicit type coercion instruction. else => return gz.addPlNode(ri.zirTag(), src_node, Zir.Inst.As{ .dest_type = ty_inst,