mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
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.
This commit is contained in:
parent
147beec7da
commit
f0a4bb6bd1
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user