diff --git a/src/Liveness.zig b/src/Liveness.zig index f7d4353e39e54190aea5f58891b166f98ccd8bbf..92ec51e5748132d900988a7f93d2140adb2950e0 100644 --- a/src/Liveness.zig +++ b/src/Liveness.zig @@ -368,7 +368,7 @@ fn analyzeInst( .vector_init => { const ty_pl = inst_datas[inst].ty_pl; const vector_ty = a.air.getRefType(ty_pl.ty); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const elements = @bitCast([]const Air.Inst.Ref, a.air.extra[ty_pl.payload..][0..len]); if (elements.len <= bpi - 1) { diff --git a/src/Sema.zig b/src/Sema.zig index e52eb6e79ca232651735926e1b5af9631ddd82b9..165f629aab9ca57cfaaf4cf29d90be387654fc15 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -11010,7 +11010,7 @@ fn zirClzCtz( const result_scalar_ty = try Type.smallestUnsignedInt(sema.arena, bits); switch (operand_ty.zigTypeTag()) { .Vector => { - const vec_len = operand_ty.arrayLen(); + const vec_len = operand_ty.vectorLen(); const result_ty = try Type.vector(sema.arena, vec_len, result_scalar_ty); if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |val| { if (val.isUndef()) return sema.addConstUndef(result_ty); @@ -14578,7 +14578,7 @@ fn coerceVectors( ) !Air.Inst.Ref { const inst_ty = sema.typeOf(inst); const inst_len = inst_ty.arrayLen(); - const dest_len = dest_ty.arrayLen(); + const dest_len = try sema.usizeCast(block, dest_ty_src, dest_ty.arrayLen()); if (dest_len != inst_len) { const msg = msg: { diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index 0261813dcb1fc5f7add29b3252d3134d836635c3..f8a774af3b6d1e958c04816856b88c3cfd19d764 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -2577,7 +2577,7 @@ fn airSplat(self: *Self, inst: Air.Inst.Index) !void { fn airVectorInit(self: *Self, inst: Air.Inst.Index) !void { const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const elements = @bitCast([]const Air.Inst.Ref, self.air.extra[ty_pl.payload..][0..len]); const result: MCValue = res: { diff --git a/src/arch/arm/CodeGen.zig b/src/arch/arm/CodeGen.zig index 4d74d7000a11015d17576effdc48e2abc686cba4..45739dca55ca43adf182ef25e8bde576da89c3a2 100644 --- a/src/arch/arm/CodeGen.zig +++ b/src/arch/arm/CodeGen.zig @@ -3675,7 +3675,7 @@ fn airSplat(self: *Self, inst: Air.Inst.Index) !void { fn airVectorInit(self: *Self, inst: Air.Inst.Index) !void { const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const elements = @bitCast([]const Air.Inst.Ref, self.air.extra[ty_pl.payload..][0..len]); const result: MCValue = res: { diff --git a/src/arch/riscv64/CodeGen.zig b/src/arch/riscv64/CodeGen.zig index 76101aa8c7c366d6da57b70657be58cef35d404f..c5f0d4fb250e378df5278e123b43f8b889c7e704 100644 --- a/src/arch/riscv64/CodeGen.zig +++ b/src/arch/riscv64/CodeGen.zig @@ -2076,7 +2076,7 @@ fn airSplat(self: *Self, inst: Air.Inst.Index) !void { fn airVectorInit(self: *Self, inst: Air.Inst.Index) !void { const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const elements = @bitCast([]const Air.Inst.Ref, self.air.extra[ty_pl.payload..][0..len]); const result: MCValue = res: { diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index 5c03253a606197e955c8c9c7e2902dd6469d55aa..97b43b3067866a9a2eb6f101c6e7ea4482ef069d 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -3239,7 +3239,7 @@ fn airVectorInit(self: *Self, inst: Air.Inst.Index) !void { if (self.liveness.isUnused(inst)) return WValue{ .none = {} }; const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const elements = @bitCast([]const Air.Inst.Ref, self.air.extra[ty_pl.payload..][0..len]); diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 9cfc7cdfa75e31baca3e34a4ded920fba015069b..9f4feb56e61783eed3a7ea25f55099ebde3c7624 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -3669,7 +3669,7 @@ fn airSplat(self: *Self, inst: Air.Inst.Index) !void { fn airVectorInit(self: *Self, inst: Air.Inst.Index) !void { const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const ty_pl = self.air.instructions.items(.data)[inst].ty_pl; const elements = @bitCast([]const Air.Inst.Ref, self.air.extra[ty_pl.payload..][0..len]); const result: MCValue = res: { diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 0bd543fab7bba3388a50190cc5099e2143e99db8..05ec1b1a888d49d5ae90d41bc316877158ebf0eb 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -3038,7 +3038,7 @@ fn airVectorInit(f: *Function, inst: Air.Inst.Index) !CValue { const inst_ty = f.air.typeOfIndex(inst); const ty_pl = f.air.instructions.items(.data)[inst].ty_pl; const vector_ty = f.air.getRefType(ty_pl.ty); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const elements = @bitCast([]const Air.Inst.Ref, f.air.extra[ty_pl.payload..][0..len]); const writer = f.object.writer(); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 7b944109126f3721320fe6cf7a4ea4d3f1580f77..7858fa76fa92f1bf07304a4519c21c09abab97f4 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -873,7 +873,7 @@ pub const DeclGen = struct { }, .Vector => { const elem_type = try dg.llvmType(t.childType()); - return elem_type.vectorType(@intCast(c_uint, t.arrayLen())); + return elem_type.vectorType(t.vectorLen()); }, .Optional => { var buf: Type.Payload.ElemType = undefined; @@ -4170,7 +4170,7 @@ pub const FuncGen = struct { const target = self.dg.module.getTarget(); const bits = operand_ty.intInfo(target).bits; const vec_len: ?u32 = switch (operand_ty.zigTypeTag()) { - .Vector => @intCast(u32, operand_ty.arrayLen()), + .Vector => operand_ty.vectorLen(), else => null, }; @@ -4372,7 +4372,7 @@ pub const FuncGen = struct { const scalar = try self.resolveInst(ty_op.operand); const scalar_ty = self.air.typeOf(ty_op.operand); const vector_ty = self.air.typeOfIndex(inst); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const scalar_llvm_ty = try self.dg.llvmType(scalar_ty); const op_llvm_ty = scalar_llvm_ty.vectorType(1); const u32_llvm_ty = self.context.intType(32); diff --git a/src/print_air.zig b/src/print_air.zig index b96e35b254611452b9c30e281d2126fa0fa10ec8..10ca034d1f0eb4b297a646431122932dd4d9690f 100644 --- a/src/print_air.zig +++ b/src/print_air.zig @@ -295,7 +295,7 @@ const Writer = struct { fn writeVectorInit(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void { const ty_pl = w.air.instructions.items(.data)[inst].ty_pl; const vector_ty = w.air.getRefType(ty_pl.ty); - const len = @intCast(u32, vector_ty.arrayLen()); + const len = vector_ty.vectorLen(); const elements = @bitCast([]const Air.Inst.Ref, w.air.extra[ty_pl.payload..][0..len]); try s.print("{}, [", .{vector_ty}); diff --git a/src/type.zig b/src/type.zig index 40ce977711bede6a944070a20c696c6263139aa2..b759a4bc34cc10fdd64a0cd00db30ff2f6c6913d 100644 --- a/src/type.zig +++ b/src/type.zig @@ -3005,6 +3005,13 @@ pub const Type = extern union { return ty.arrayLen() + @boolToInt(ty.sentinel() != null); } + pub fn vectorLen(ty: Type) u32 { + return switch (ty.tag()) { + .vector => @intCast(u32, ty.castTag(.vector).?.data.len), + else => unreachable, + }; + } + /// Asserts the type is an array, pointer or vector. pub fn sentinel(self: Type) ?Value { return switch (self.tag()) {